Exempel: Använd Azure-biblioteken för att skapa en databas
Det här exemplet visar hur du använder Azure SDK-hanteringsbiblioteken i ett Python-skript för att skapa en flexibel Azure Database for MySQL-serverinstans och databas. Det innehåller också ett enkelt skript för att fråga databasen med hjälp av mysql-connector-biblioteket (inte en del av Azure SDK). Du kan använda liknande kod för att skapa en flexibel serverinstans och databas i Azure Database for PostgreSQL.
Motsvarande Azure CLI-kommandon finns senare i den här artikeln. Om du föredrar att använda Azure-portalen kan du läsa Skapa en MySQL-server eller Skapa en PostgreSQL-server.
Alla kommandon i den här artikeln fungerar på samma sätt i Linux/macOS bash- och Windows-kommandogränssnitt om de inte anges.
1: Konfigurera din lokala utvecklingsmiljö
Om du inte redan har gjort det konfigurerar du en miljö där du kan köra koden. Här följer några alternativ:
Konfigurera en virtuell Python-miljö med hjälp av
venv
eller valfritt verktyg. Du kan skapa den virtuella miljön lokalt eller i Azure Cloud Shell och köra koden där. Var noga med att aktivera den virtuella miljön för att börja använda den.Använd en conda-miljö.
Använd en Dev-container i Visual Studio Code eller GitHub Codespaces.
2: Installera nödvändiga Azure-bibliotekspaket
Skapa en fil med namnet requirements.txt med följande innehåll:
azure-mgmt-resource
azure-mgmt-rdbms
azure-identity
mysql-connector-python
Installera kraven i en terminal med den virtuella miljön aktiverad:
pip install -r requirements.txt
Kommentar
Om du försöker installera mysql-biblioteket i ett 32-bitars Python-bibliotek i Windows uppstår ett fel om filen mysql.h . I det här fallet installerar du en 64-bitarsversion av Python och försöker igen.
3: Skriv kod för att skapa databasen
Skapa en Python-fil med namnet provision_db.py med följande kod. Kommentarerna förklarar informationen. I synnerhet anger du miljövariabler för AZURE_SUBSCRIPTION_ID
och PUBLIC_IP_ADDRESS
. Den senare variabeln är din arbetsstations IP-adress för det här exemplet. Du kan använda WhatsIsMyIP för att hitta din IP-adress.
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}")
Autentisering i koden
Senare i den här artikeln loggar du in på Azure med Azure CLI för att köra exempelkoden. Om ditt konto har behörighet att skapa resursgrupper och lagringsresurser i din Azure-prenumeration körs koden.
Om du vill använda sådan kod i ett produktionsskript kan du ange miljövariabler så att de använder en tjänsthuvudnamnsbaserad metod för autentisering. Mer information finns i Autentisera Python-appar med Azure-tjänster. Du måste se till att tjänstens huvudnamn har tillräcklig behörighet för att skapa resursgrupper och lagringsresurser i din prenumeration genom att tilldela den en lämplig roll i Azure, till exempel rollen Deltagare i din prenumeration.
Referenslänkar för klasser som används i koden
- ResourceManagementClient (azure.mgmt.resource)
- MySQLManagementClient (azure.mgmt.rdbms.mysql_flexibleservers)
- Server (azure.mgmt.rdbms.mysql_flexibleservers.models)
- ServerVersion (azure.mgmt.rdbms.mysql_flexibleservers.models)
Information om PostreSQL-databasservern finns i:
4: Kör skriptet
Om du inte redan har gjort det loggar du in på Azure med Hjälp av Azure CLI:
az login
AZURE_SUBSCRIPTION_ID
Ange miljövariablerna ochPUBLIC_IP_ADDRESS
. Du kan köra kommandot az account show för att hämta ditt prenumerations-ID frånid
egenskapen i utdata. Du kan använda WhatsIsMyIP för att hitta din IP-adress.set AZURE_SUBSCRIPTION_ID=00000000-0000-0000-0000-000000000000 set PUBLIC_IP_ADDRESS=<Your public IP address>
Du kan också ange variablerna
DB_SERVER_NAME
,DB_ADMIN_NAME
ochDB_ADMIN_PASSWORD
miljö. Annars används kodstandarder.Kör skriptet:
python provision_db.py
5: Infoga en post och fråga databasen
Skapa en fil med namnet use_db.py med följande kod. Observera beroendena för DB_SERVER_NAME
miljövariablerna , DB_ADMIN_NAME
och DB_ADMIN_PASSWORD
. Du får dessa värden från utdata från körning av föregående kod provision_db.py eller i själva koden.
Den här koden fungerar endast för MySQL; du använder olika bibliotek för 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()
All den här koden använder API:et mysql.connector. Den enda Azure-specifika delen är den fullständiga värddomänen för MySQL-servern (mysql.database.azure.com).
Ladda sedan ned certifikatet som behövs för att kommunicera via TSL/SSL med din Azure Database for MySQL-server från https://www.digicert.com/CACerts/BaltimoreCyberTrustRoot.crt.pem och spara certifikatfilen i samma mapp som Python-filen. Mer information finns i Hämta ett SSL-certifikat i Dokumentation om Azure Database for MySQL.
Kör slutligen koden:
python use_db.py
Om du ser ett fel om att klientens IP-adress inte är tillåten kontrollerar du att du har definierat miljövariabeln PUBLIC_IP_ADDRESS
korrekt. Om du redan har skapat MySQL-servern med fel IP-adress kan du lägga till en annan i Azure-portalen. I portalen väljer du MySQL-servern och sedan Anslutningssäkerhet. Lägg till IP-adressen för din arbetsstation i listan över tillåtna IP-adresser.
6: Rensa resurser
Kör kommandot az group delete om du inte behöver behålla resursgruppen och lagringsresurserna som skapas i det här exemplet.
Resursgrupper debiteras inte några löpande avgifter i din prenumeration, men resurser, till exempel lagringskonton, i resursgruppen kan fortsätta att debiteras. Det är en bra idé att rensa alla grupper som du inte aktivt använder. Argumentet --no-wait
gör att kommandot kan returneras omedelbart i stället för att vänta på att åtgärden ska slutföras.
az group delete -n PythonAzureExample-DB-rg --no-wait
Du kan också använda ResourceManagementClient.resource_groups.begin_delete
metoden för att ta bort en resursgrupp från koden. Koden i Exempel: Skapa en resursgrupp visar användning.
Som referens: motsvarande Azure CLI-kommandon
Följande Azure CLI-kommandon utför samma etableringssteg som Python-skriptet. Använd kommandon för en PostgreSQL-databas 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
Se även
- Exempel: Skapa en resursgrupp
- Exempel: Lista resursgrupper i en prenumeration
- Exempel: Skapa Azure Storage
- Exempel: Använda Azure Storage
- Exempel: Skapa och distribuera en webbapp
- Exempel: Skapa en virtuell dator
- Använda Azure Managed Disks med virtuella datorer
- Slutför en kort undersökning om Azure SDK för Python