Teilen über


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:

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.

Informationen zum PostreSQL-Datenbank-Server finden Sie unter:

4: Ausführen des Skripts

  1. Wenn Sie das noch nicht getan haben, melden Sie sich mithilfe der Azure CLI bei Azure an:

    az login
    
  2. Legen Sie die Umgebungsvariablen AZURE_SUBSCRIPTION_ID und PUBLIC_IP_ADDRESS fest. Sie können den Befehl az account show ausführen, um Ihre Abonnement-ID aus der id Eigenschaft in der Ausgabe abrufen. Sie können WhatIsMyIP verwenden, um Ihre IP-Adresse zu finden.

    set AZURE_SUBSCRIPTION_ID=00000000-0000-0000-0000-000000000000
    set PUBLIC_IP_ADDRESS=<Your public IP address>
    
  3. Legen Sie optional die Umgebungsvariablen DB_SERVER_NAME DB_ADMIN_NAME und DB_ADMIN_PASSWORD fest. Andernfalls werden Code-Standardwerte verwendet.

  4. 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