Sdílet prostřednictvím


Příklad: Vytvoření databáze pomocí knihoven Azure

Tento příklad ukazuje, jak pomocí knihoven pro správu sady Azure SDK ve skriptu Pythonu vytvořit instanci a databázi flexibilního serveru Azure Database for MySQL. Poskytuje také jednoduchý skript pro dotazování databáze pomocí knihovny mysql-connector (nikoli součástí sady Azure SDK). Podobný kód můžete použít k vytvoření instance a databáze flexibilního serveru Azure Database for PostgreSQL.

Ekvivalentní příkazy Azure CLI jsou dále v tomto článku. Pokud dáváte přednost použití webu Azure Portal, přečtěte si téma Vytvoření serveru MySQL nebo vytvoření serveru PostgreSQL.

Všechny příkazy v tomto článku fungují stejně v prostředích Bash pro Linux/macOS a Windows, pokud není uvedeno.

1: Nastavení místního vývojového prostředí

Pokud jste to ještě neudělali, nastavte prostředí, ve kterém můžete kód spustit. Zde je uvedeno několik možností:

2: Instalace potřebných balíčků knihovny Azure

Vytvořte soubor s názvem requirements.txt s následujícím obsahem:

azure-mgmt-resource
azure-mgmt-rdbms
azure-identity
mysql-connector-python

V terminálu s aktivovaným virtuálním prostředím nainstalujte požadavky:

pip install -r requirements.txt

Poznámka:

Při pokusu o instalaci knihovny mysql do 32bitové knihovny Pythonu ve Windows dojde k chybě o souboru mysql.h . V tomto případě nainstalujte 64bitovou verzi Pythonu a zkuste to znovu.

3: Napsání kódu pro vytvoření databáze

Vytvořte soubor Pythonu s názvem provision_db.py s následujícím kódem. Komentáře vysvětlují podrobnosti. Konkrétně zadejte proměnné prostředí pro AZURE_SUBSCRIPTION_ID a PUBLIC_IP_ADDRESS. Druhá proměnná je IP adresa vaší pracovní stanice, aby se tato ukázka spustila. Pomocí aplikace WhatsIsMyIP můžete najít svou IP adresu.

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}")

Ověřování v kódu

Později v tomto článku se přihlásíte k Azure pomocí Azure CLI a spustíte vzorový kód. Pokud má váš účet oprávnění k vytváření skupin prostředků a prostředků úložiště ve vašem předplatném Azure, kód se úspěšně spustí.

Pokud chcete tento kód použít v produkčním skriptu, můžete nastavit proměnné prostředí tak, aby pro ověřování používaly metodu založenou na instančním objektu. Další informace najdete v tématu Ověřování aplikací v Pythonu pomocí služeb Azure. Musíte zajistit, aby instanční objekt má dostatečná oprávnění k vytváření skupin prostředků a prostředků úložiště ve vašem předplatném tím, že mu v Azure přiřadíte odpovídající roli, například roli Přispěvatel ve vašem předplatném.

Databázový server PostreSQL najdete tady:

4: Spuštění skriptu

  1. Pokud jste to ještě neudělali, přihlaste se k Azure pomocí Azure CLI:

    az login
    
  2. AZURE_SUBSCRIPTION_ID Nastavte proměnné prostředí a PUBLIC_IP_ADDRESS proměnné prostředí. Spuštěním příkazu az account show můžete získat ID předplatného id z vlastnosti ve výstupu. Pomocí aplikace WhatsIsMyIP můžete najít svou IP adresu.

    set AZURE_SUBSCRIPTION_ID=00000000-0000-0000-0000-000000000000
    set PUBLIC_IP_ADDRESS=<Your public IP address>
    
  3. Volitelně můžete nastavit DB_SERVER_NAMEproměnné , DB_ADMIN_NAMEa DB_ADMIN_PASSWORD prostředí. V opačném případě se použijí výchozí hodnoty kódu.

  4. Spusťte skript:

    python provision_db.py
    

5: Vložení záznamu a dotazování databáze

Vytvořte soubor s názvem use_db.py s následujícím kódem. Všimněte si závislostí na DB_SERVER_NAMEproměnných prostředí , DB_ADMIN_NAMEa DB_ADMIN_PASSWORD prostředí. Tyto hodnoty získáte z výstupu spuštění předchozího kódu provision_db.py nebo v samotném kódu.

Tento kód funguje pouze pro MySQL; používáte různé knihovny pro PostgreSQL.

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()

Veškerý tento kód používá rozhraní API mysql.connectoru. Jediná část specifická pro Azure je úplná hostitelská doména pro server MySQL (mysql.database.azure.com).

Dále stáhněte certifikát potřebný ke komunikaci přes protokol TSL/SSL se serverem https://www.digicert.com/CACerts/BaltimoreCyberTrustRoot.crt.pem Azure Database for MySQL a uložte soubor certifikátu do stejné složky jako soubor Pythonu. Další informace najdete v tématu Získání certifikátu SSL v dokumentaci ke službě Azure Database for MySQL.

Nakonec spusťte kód:

python use_db.py

Pokud se zobrazí chyba, že ip adresa klienta není povolená, zkontrolujte, jestli jste správně definovali proměnnou PUBLIC_IP_ADDRESS prostředí. Pokud jste už vytvořili server MySQL s nesprávnou IP adresou, můžete na webu Azure Portal přidat další. Na portálu vyberte server MySQL a pak vyberte Připojení zabezpečení. Přidejte IP adresu pracovní stanice do seznamu povolených IP adres.

6: Vyčištění prostředků

Pokud v tomto příkladu nepotřebujete zachovat skupinu prostředků a prostředky úložiště vytvořené v tomto příkladu, spusťte příkaz az group delete .

Ve vašem předplatném se za skupiny prostředků neúčtují žádné průběžné poplatky, ale za prostředky, jako jsou účty úložiště, se ve skupině prostředků můžou dál účtovat poplatky. Je vhodné vyčistit jakoukoli skupinu, kterou aktivně nepoužíváte. Argument --no-wait umožňuje, aby se příkaz vrátil okamžitě místo čekání na dokončení operace.

az group delete -n PythonAzureExample-DB-rg  --no-wait

Metodu ResourceManagementClient.resource_groups.begin_delete můžete použít také k odstranění skupiny prostředků z kódu. Kód v příkladu: Vytvoření skupiny prostředků ukazuje použití.

Referenční informace: Ekvivalentní příkazy Azure CLI

Následující příkazy Azure CLI dokončí stejné kroky zřizování jako skript Pythonu. Pro databázi PostgreSQL použijte az postgres flexible-server příkazy.

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

Viz také