Przykład: tworzenie bazy danych przy użyciu bibliotek platformy Azure

W tym przykładzie pokazano, jak utworzyć elastyczne wystąpienie serwera i bazę danych usługi Azure Database for MySQL za pomocą bibliotek zarządzania zestawu Azure SDK w skryscie języka Python. Udostępnia również prosty skrypt do wykonywania zapytań dotyczących bazy danych przy użyciu biblioteki mysql-connector (a nie części zestawu Azure SDK). Możesz użyć podobnego kodu, aby utworzyć elastyczne wystąpienie serwera i bazę danych usługi Azure Database for PostgreSQL.

Równoważne polecenia interfejsu wiersza polecenia platformy Azure znajdują się w dalszej części tego artykułu. Jeśli wolisz używać witryny Azure Portal, zobacz Tworzenie serwera MySQL lub Tworzenie serwera PostgreSQL.

Wszystkie polecenia w tym artykule działają tak samo w powłokach poleceń systemu Linux/macOS i Windows, chyba że zostały zaznaczone.

1: Konfigurowanie lokalnego środowiska projektowego

Jeśli jeszcze tego nie zrobiono, skonfiguruj środowisko, w którym można uruchomić kod. Oto kilka opcji:

2: Instalowanie wymaganych pakietów bibliotek platformy Azure

Utwórz plik o nazwie requirements.txt z następującą zawartością:

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

W terminalu z aktywowanym środowiskiem wirtualnym zainstaluj wymagania:

pip install -r requirements.txt

Uwaga

W systemie Windows próba zainstalowania biblioteki mysql w 32-bitowej bibliotece języka Python powoduje błąd dotyczący pliku mysql.h . W takim przypadku zainstaluj 64-bitową wersję języka Python i spróbuj ponownie.

3. Pisanie kodu w celu utworzenia bazy danych

Utwórz plik w języku Python o nazwie provision_db.py przy użyciu następującego kodu. Komentarze wyjaśniają szczegóły. W szczególności określ zmienne środowiskowe dla AZURE_SUBSCRIPTION_ID i PUBLIC_IP_ADDRESS. Ta ostatnia zmienna to adres IP stacji roboczej dla tego przykładu do uruchomienia. Możesz użyć WhatsIsMyIP , aby znaleźć swój adres IP.

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

Uwierzytelnianie w kodzie

W dalszej części tego artykułu zalogujesz się na platformie Azure przy użyciu interfejsu wiersza polecenia platformy Azure, aby uruchomić przykładowy kod. Jeśli Twoje konto ma uprawnienia do tworzenia grup zasobów i zasobów magazynu w ramach subskrypcji platformy Azure, kod zostanie uruchomiony pomyślnie.

Aby użyć takiego kodu w skryscie produkcyjnym, można ustawić zmienne środowiskowe, aby użyć metody opartej na jednostce usługi na potrzeby uwierzytelniania. Aby dowiedzieć się więcej, zobacz Jak uwierzytelniać aplikacje języka Python za pomocą usług platformy Azure. Musisz upewnić się, że jednostka usługi ma wystarczające uprawnienia do tworzenia grup zasobów i zasobów magazynu w ramach subskrypcji, przypisując jej odpowiednią rolę na platformie Azure, na przykład rolę Współautor w subskrypcji.

W przypadku serwera bazy danych PostreSQL zobacz:

4. Uruchamianie skryptu

  1. Jeśli jeszcze tego nie zrobiono, zaloguj się do platformy Azure przy użyciu interfejsu wiersza polecenia platformy Azure:

    az login
    
  2. AZURE_SUBSCRIPTION_ID Ustaw zmienne środowiskowe i PUBLIC_IP_ADDRESS . Możesz uruchomić polecenie az account show , aby uzyskać identyfikator subskrypcji z id właściwości w danych wyjściowych. Możesz użyć WhatsIsMyIP , aby znaleźć swój adres IP.

    set AZURE_SUBSCRIPTION_ID=00000000-0000-0000-0000-000000000000
    set PUBLIC_IP_ADDRESS=<Your public IP address>
    
  3. Opcjonalnie ustaw DB_SERVER_NAMEzmienne środowiskowe , DB_ADMIN_NAMEi DB_ADMIN_PASSWORD ; w przeciwnym razie są używane wartości domyślne kodu.

  4. Uruchom skrypt:

    python provision_db.py
    

5. Wstawianie rekordu i wykonywanie zapytań względem bazy danych

Utwórz plik o nazwie use_db.py przy użyciu następującego kodu. Zwróć uwagę na zależności zmiennych DB_SERVER_NAMEśrodowiskowych , DB_ADMIN_NAMEi DB_ADMIN_PASSWORD . Te wartości są uzyskiwane z danych wyjściowych uruchomienia poprzedniego kodu provision_db.py lub w samym kodzie.

Ten kod działa tylko w przypadku programu MySQL; używasz różnych bibliotek dla bazy danych 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()

Cały ten kod używa interfejsu API mysql.connector. Jedyną częścią specyficzną dla platformy Azure jest pełna domena hosta dla serwera MySQL (mysql.database.azure.com).

Następnie pobierz certyfikat wymagany do komunikacji za pośrednictwem protokołu TSL/SSL z serwerem https://www.digicert.com/CACerts/BaltimoreCyberTrustRoot.crt.pem usługi Azure Database for MySQL i zapisz plik certyfikatu w tym samym folderze co plik języka Python. Aby uzyskać więcej informacji, zobacz Uzyskiwanie certyfikatu SSL w dokumentacji usługi Azure Database for MySQL.

Na koniec uruchom kod:

python use_db.py

Jeśli zostanie wyświetlony błąd, że adres IP klienta jest niedozwolony, sprawdź, czy zmienna środowiskowa PUBLIC_IP_ADDRESS została zdefiniowana poprawnie. Jeśli serwer MySQL został już utworzony przy użyciu nieprawidłowego adresu IP, możesz dodać inny adres w witrynie Azure Portal. W portalu wybierz serwer MySQL, a następnie wybierz pozycję zabezpieczenia Połączenie ion. Dodaj adres IP stacji roboczej do listy dozwolonych adresów IP.

6. Czyszczenie zasobów

Uruchom polecenie az group delete, jeśli nie musisz przechowywać grupy zasobów i zasobów magazynu utworzonych w tym przykładzie.

Grupy zasobów nie generują żadnych bieżących opłat w ramach subskrypcji, ale zasoby, takie jak konta magazynu, w grupie zasobów mogą nadal ponosić opłaty. Dobrym rozwiązaniem jest wyczyszczenie każdej grupy, której nie używasz aktywnie. Argument --no-wait umożliwia polecenie natychmiastowego zwrócenia zamiast oczekiwania na zakończenie operacji.

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

Możesz również użyć ResourceManagementClient.resource_groups.begin_delete metody , aby usunąć grupę zasobów z kodu. Kod w przykładzie: Tworzenie grupy zasobów demonstruje użycie.

Aby uzyskać informacje ogólne: równoważne polecenia interfejsu wiersza polecenia platformy Azure

Następujące polecenia interfejsu wiersza polecenia platformy Azure wykonaj te same kroki aprowizacji co skrypt języka Python. W przypadku bazy danych PostgreSQL użyj az postgres flexible-server poleceń.

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

Zobacz też