Beispiel: Verwenden der Azure-Bibliotheken zum Erstellen einer Datenbank
In diesem Beispiel wird veranschaulicht, wie Sie die Azure SDK-Verwaltungsbibliotheken in einem Python-Skript verwenden, um eine Azure Database for MySQL-Instanz eines flexiblen Servers und -Datenbank zu erstellen. Darüber hinaus finden Sie hier ein einfaches Skript zum Abfragen der Datenbank unter Verwendung der Bibliothek „mysql-connector“ (nicht im Azure SDK enthalten). Sie können einen ähnlichen Code verwenden, um eine Azure Database for PostgreSQL-Instanz eines flexiblen Servers und -Datenbank zu erstellen.
Äquivalente Azure CLI-Befehle finden Sie weiter unten in diesem Artikel. Wenn Sie das Azure-Portal bevorzugen, finden Sie weitere Informationen unter Erstellen eines MySQL-Servers oder Erstellen eines PostgreSQL-Servers.
Alle Befehle in diesem Artikel funktionieren in Linux-/macOS-Bash- und Windows-Befehlsshells identisch, sofern nicht anders angegeben.
1: Einrichten Ihrer lokalen Entwicklungsumgebung
Falls noch nicht geschehen, richten Sie eine Umgebung ein, in der Sie den Code ausführen können. Hier einige Optionen:
Konfigurieren Sie eine virtuelle Python-Umgebung mithilfe von
venv
oder dem Tool Ihrer Wahl. Sie können die virtuelle Umgebung lokal oder in Azure Cloud Shell erstellen und den Code dort ausführen. Stellen Sie sicher, dass Sie die virtuelle Umgebung aktivieren, um sie verwenden zu können.Verwenden Sie eine Conda-Umgebung.
Verwenden Sie einen Entwicklungscontainer in Visual Studio Code oder GitHub Codespaces.
2: Installieren der erforderlichen Azure-Bibliothekspakete
Erstellen Sie eine Datei namens requirements.txt mit folgendem Inhalt:
azure-mgmt-resource
azure-mgmt-rdbms
azure-identity
mysql-connector-python
Installieren Sie in einem Terminal bei aktivierter virtueller Umgebung die Voraussetzungen:
pip install -r requirements.txt
Hinweis
Wenn Sie unter Windows versuchen, die MySQL-Bibliothek in einer 32-Bit-Python-Bibliothek zu installieren, tritt ein Fehler für die Datei mysql.h auf. Installieren Sie in diesem Fall eine 64-Bit-Version von Python, und versuchen Sie es noch mal.
3: Schreiben von Code zum Erstellen der Datenbank
Erstellen Sie eine Python-Datei mit dem Namen provision_db.py und dem folgenden Code. Die Details werden in den Kommentaren erläutert: Geben Sie insbesondere Umgebungsvariablen für AZURE_SUBSCRIPTION_ID
und PUBLIC_IP_ADDRESS
an. Letztere Variable ist die IP-Adresse Ihrer Arbeitsstation für die Ausführung dieses Beispiels. Sie können WhatIsMyIP verwenden, um Ihre IP-Adresse zu finden.
import random, os
from azure.identity import DefaultAzureCredential
from azure.mgmt.resource import ResourceManagementClient
from azure.mgmt.rdbms.mysql_flexibleservers import MySQLManagementClient
from azure.mgmt.rdbms.mysql_flexibleservers.models import Server, ServerVersion
# Acquire a credential object using CLI-based authentication.
credential = DefaultAzureCredential()
# Retrieve subscription ID from environment variable
subscription_id = os.environ["AZURE_SUBSCRIPTION_ID"]
# Constants we need in multiple places: the resource group name and the region
# in which we provision resources. You can change these values however you want.
RESOURCE_GROUP_NAME = 'PythonAzureExample-DB-rg'
LOCATION = "southcentralus"
# Step 1: Provision the resource group.
resource_client = ResourceManagementClient(credential, subscription_id)
rg_result = resource_client.resource_groups.create_or_update(RESOURCE_GROUP_NAME,
{ "location": LOCATION })
print(f"Provisioned resource group {rg_result.name}")
# For details on the previous code, see Example: Provision a resource group
# at https://docs.microsoft.com/azure/developer/python/azure-sdk-example-resource-group
# Step 2: Provision the database server
# We use a random number to create a reasonably unique database server name.
# If you've already provisioned a database and need to re-run the script, set
# the DB_SERVER_NAME environment variable to that name instead.
#
# Also set DB_USER_NAME and DB_USER_PASSWORD variables to avoid using the defaults.
db_server_name = os.environ.get("DB_SERVER_NAME", f"python-azure-example-mysql-{random.randint(1,100000):05}")
db_admin_name = os.environ.get("DB_ADMIN_NAME", "azureuser")
db_admin_password = os.environ.get("DB_ADMIN_PASSWORD", "ChangePa$$w0rd24")
# Obtain the management client object
mysql_client = MySQLManagementClient(credential, subscription_id)
# Provision the server and wait for the result
poller = mysql_client.servers.begin_create(RESOURCE_GROUP_NAME,
db_server_name,
Server(
location=LOCATION,
administrator_login=db_admin_name,
administrator_login_password=db_admin_password,
version=ServerVersion.FIVE7
)
)
server = poller.result()
print(f"Provisioned MySQL server {server.name}")
# Step 3: Provision a firewall rule to allow the local workstation to connect
RULE_NAME = "allow_ip"
ip_address = os.environ["PUBLIC_IP_ADDRESS"]
# For the above code, create an environment variable named PUBLIC_IP_ADDRESS that
# contains your workstation's public IP address as reported by a site like
# https://whatismyipaddress.com/.
# Provision the rule and wait for completion
poller = mysql_client.firewall_rules.begin_create_or_update(RESOURCE_GROUP_NAME,
db_server_name, RULE_NAME,
{ "start_ip_address": ip_address, "end_ip_address": ip_address }
)
firewall_rule = poller.result()
print(f"Provisioned firewall rule {firewall_rule.name}")
# Step 4: Provision a database on the server
db_name = os.environ.get("DB_NAME", "example-db1")
poller = mysql_client.databases.begin_create_or_update(RESOURCE_GROUP_NAME,
db_server_name, db_name, {})
db_result = poller.result()
print(f"Provisioned MySQL database {db_result.name} with ID {db_result.id}")
Authentifizierung im Code
Später in diesem Artikel melden Sie sich mit der Azure CLI bei Azure an, um den Beispielcode auszuführen. Wenn Ihr Konto über Berechtigungen zum Erstellen und Auflisten von Ressourcengruppen und Speicherressourcen in Ihrem Azure-Abonnement verfügt, wird der Code erfolgreich ausgeführt.
Zur Verwendung eines solchen Codes in einem Produktionsskript können Sie Umgebungsvariablen so festlegen, dass eine dienstprinzipalbasierte Methode zur Authentifizierung verwendet wird. Weitere Informationen finden Sie unter Authentifizieren von Python-Apps mit Azure-Diensten. Sie müssen sicherstellen, dass der Dienstprinzipal über ausreichende Berechtigungen zum Erstellen und Auflisten von Ressourcengruppen und Speicherressourcen in Ihrem Abonnement verfügt, indem Sie ihm eine entsprechende Rolle in Azure zuweisen, z. B. die Rolle „Mitwirkender“ in Ihrem Abonnement.
Referenzlinks für im Code verwendete Klassen
- ResourceManagementClient (azure.mgmt.resource)
- MySQLManagementClient (azure.mgmt.rdbms.mysql_flexibleservers)
- Server (azure.mgmt.rdbms.mysql_flexibleservers.models)
- ServerVersion (azure.mgmt.rdbms.mysql_flexibleservers.models)
Informationen zum PostreSQL-Datenbank-Server finden Sie unter:
4: Ausführen des Skripts
Wenn Sie das noch nicht getan haben, melden Sie sich mithilfe der Azure CLI bei Azure an:
az login
Legen Sie die Umgebungsvariablen
AZURE_SUBSCRIPTION_ID
undPUBLIC_IP_ADDRESS
fest. Sie können den Befehl az account show ausführen, um Ihre Abonnement-ID aus derid
Eigenschaft in der Ausgabe abrufen. Sie können WhatIsMyIP verwenden, um Ihre IP-Adresse zu finden.Legen Sie optional die Umgebungsvariablen
DB_SERVER_NAME
DB_ADMIN_NAME
undDB_ADMIN_PASSWORD
fest. Andernfalls werden Code-Standardwerte verwendet.Ausführen des Skripts:
python provision_db.py
5: Einfügen eines Datensatzes und Abfragen der Datenbank
Erstellen Sie eine Datei namens use_db.py mit folgendem Code. Beachten Sie die Abhängigkeiten von den Umgebungsvariablen DB_SERVER_NAME
DB_ADMIN_NAME
und DB_ADMIN_PASSWORD
. Sie erhalten diese Werte aus der Ausgabe der Ausführung des vorherigen Codes provision_db.py oder im Code selbst.
Dieser Code funktioniert nur für MySQL. Für PostgreSQL müssen andere Bibliotheken verwendet werden.
import os
import mysql.connector
db_server_name = os.environ["DB_SERVER_NAME"]
db_admin_name = os.getenv("DB_ADMIN_NAME", "azureuser")
db_admin_password = os.getenv("DB_ADMIN_PASSWORD", "ChangePa$$w0rd24")
db_name = os.getenv("DB_NAME", "example-db1")
db_port = os.getenv("DB_PORT", 3306)
connection = mysql.connector.connect(user=db_admin_name,
password=db_admin_password, host=f"{db_server_name}.mysql.database.azure.com",
port=db_port, database=db_name, ssl_ca='./BaltimoreCyberTrustRoot.crt.pem')
cursor = connection.cursor()
"""
# Alternate pyodbc connection; include pyodbc in requirements.txt
import pyodbc
driver = "{MySQL ODBC 5.3 UNICODE Driver}"
connect_string = f"DRIVER={driver};PORT=3306;SERVER={db_server_name}.mysql.database.azure.com;" \
f"DATABASE={DB_NAME};UID={db_admin_name};PWD={db_admin_password}"
connection = pyodbc.connect(connect_string)
"""
table_name = "ExampleTable1"
sql_create = f"CREATE TABLE {table_name} (name varchar(255), code int)"
cursor.execute(sql_create)
print(f"Successfully created table {table_name}")
sql_insert = f"INSERT INTO {table_name} (name, code) VALUES ('Azure', 1)"
insert_data = "('Azure', 1)"
cursor.execute(sql_insert)
print("Successfully inserted data into table")
sql_select_values= f"SELECT * FROM {table_name}"
cursor.execute(sql_select_values)
row = cursor.fetchone()
while row:
print(str(row[0]) + " " + str(row[1]))
row = cursor.fetchone()
connection.commit()
In diesem Code wird die API „mysql.connector“ verwendet. Der einzige Azure-spezifische Teil ist die vollständige Hostdomäne für den MySQL-Server (mysql.database.azure.com).
Laden Sie als Nächstes das Zertifikat, das für die TSL/SSL-Kommunikation mit Ihrem Azure Database for MySQL-Server erforderlich ist, von https://www.digicert.com/CACerts/BaltimoreCyberTrustRoot.crt.pem herunter, und speichern Sie die Zertifikatsdatei in demselben Ordner wie die Python-Datei. Weitere Informationen finden Sie unter Abrufen eines SSL-Zertifikats in der Azure Database for MySQL-Dokumentation.
Führen Sie abschließend den Code aus:
python use_db.py
Wenn Sie eine Fehlermeldung sehen, dass Ihre Client-IP-Adresse nicht zulässig ist, überprüfen Sie, ob Sie die Umgebungsvariable PUBLIC_IP_ADDRESS
richtig definiert haben. Wenn Sie den MySQL-Server bereits mit der falschen IP-Adresse erstellt haben, können Sie eine weitere im Azure-Portal hinzufügen. Wählen Sie im Portal den MySQL-Server und dann die Verbindungssicherheit aus. Fügen Sie die IP-Adresse Ihrer Arbeitsstation zur Liste der zugelassenen IP-Adressen hinzu.
6: Bereinigen von Ressourcen
Führen Sie den Befehl az group delete aus, wenn Sie die in diesem Beispiel erstellte Ressourcengruppe und die erstellten Speicherressourcen nicht beibehalten müssen.
Ressourcengruppen verursachen keine laufenden Gebühren in Ihrem Abonnement, aber Ressourcen wie Speicherkonten in der Ressourcengruppe können weiterhin Gebühren verursachen. Es hat sich bewährt, jede Gruppe zu bereinigen, die Sie nicht aktiv verwenden. Das Argument --no-wait
ermöglicht die direkte Rückgabe des Befehls, und es muss nicht auf den Abschluss des Vorgangs gewartet werden.
az group delete -n PythonAzureExample-DB-rg --no-wait
Sie können auch die ResourceManagementClient.resource_groups.begin_delete
-Methode verwenden, um eine Ressourcengruppe aus dem Code zu löschen. Der Code unter Beispiel: Erstellen einer Ressourcengruppe veranschaulicht die Verwendung.
Zur Referenz: äquivalente Azure CLI-Befehle
Mit den folgenden Azure CLI-Befehlen können die gleichen Bereitstellungsschritte ausgeführt werden wie mit dem Python-Skript. Verwenden Sie für eine PostgreSQL-Datenbank die Befehle az postgres flexible-server
.
az group create --location southcentralus --name PythonAzureExample-DB-rg
az mysql flexible-server create --location southcentralus --resource-group PythonAzureExample-DB-rg ^
--name python-azure-example-mysql-12345 --admin-user azureuser --admin-password ChangePa$$w0rd24 ^
--sku-name Standard_B1ms --version 5.7 --yes
# Change the IP address to the public IP address of your workstation, that is, the address shown
# by a site like https://whatismyipaddress.com/.
az mysql flexible-server firewall-rule create --resource-group PythonAzureExample-DB-rg --name python-azure-example-mysql-12345 ^
--rule-name allow_ip --start-ip-address 10.11.12.13 --end-ip-address 10.11.12.13
az mysql flexible-server db create --resource-group PythonAzureExample-DB-rg --server-name python-azure-example-mysql-12345 ^
--database-name example-db1
Weitere Informationen
- Beispiel: Erstellen einer Ressourcengruppe
- Beispiel: Auflisten von Ressourcengruppen in einem Abonnement
- Beispiel: Erstellen einer Azure Storage-Instanz
- Beispiel: Verwenden von Azure Storage
- Beispiel: Erstellen und Bereitstellen einer Web-App
- Beispiel: Erstellen eines virtuellen Computers
- Verwenden verwalteter Azure-Datenträger mit den Azure-Bibliotheken (SDK) für Python
- Kurze Umfrage zum Azure SDK für Python