Voorbeeld: De Azure-bibliotheken gebruiken om een database te maken
In dit voorbeeld ziet u hoe u de Azure SDK-beheerbibliotheken in een Python-script gebruikt om een exemplaar en database van een flexibele Azure Database for MySQL-server te maken. Het biedt ook een eenvoudig script om een query uit te voeren op de database met behulp van de mysql-connectorbibliotheek (geen deel van de Azure SDK). U kunt vergelijkbare code gebruiken om een exemplaar en database van een flexibele Azure Database for PostgreSQL-server te maken.
Equivalente Azure CLI-opdrachten bevinden zich verderop in dit artikel. Als u liever Azure Portal gebruikt, raadpleegt u Een MySQL-server maken of Een PostgreSQL-server maken.
Alle opdrachten in dit artikel werken hetzelfde in Linux-/macOS-bash- en Windows-opdrachtshells, tenzij vermeld.
1: Uw lokale ontwikkelomgeving instellen
Als u dat nog niet hebt gedaan, stelt u een omgeving in waar u de code kunt uitvoeren. Hieronder volgen een aantal opties:
Configureer een virtuele Python-omgeving met behulp van
venv
of uw hulpprogramma naar keuze. U kunt de virtuele omgeving lokaal of in Azure Cloud Shell maken en daar de code uitvoeren. Zorg ervoor dat u de virtuele omgeving activeert om deze te gaan gebruiken.Gebruik een Conda-omgeving.
Gebruik een Dev-container in Visual Studio Code of GitHub Codespaces.
2: De benodigde Azure-bibliotheekpakketten installeren
Maak een bestand met de naam requirements.txt met de volgende inhoud:
azure-mgmt-resource
azure-mgmt-rdbms
azure-identity
mysql-connector-python
Installeer de vereisten in een terminal waarop de virtuele omgeving is geactiveerd:
pip install -r requirements.txt
Notitie
In Windows produceert een poging om de mysql-bibliotheek te installeren in een 32-bits Python-bibliotheek een fout over het bestand mysql.h . In dit geval installeert u een 64-bits versie van Python en probeert u het opnieuw.
3: Code schrijven om de database te maken
Maak een Python-bestand met de naam provision_db.py met de volgende code. In de opmerkingen worden de details uitgelegd. Geef met name omgevingsvariabelen op voor AZURE_SUBSCRIPTION_ID
en PUBLIC_IP_ADDRESS
. De laatste variabele is het IP-adres van uw werkstation om dit voorbeeld uit te voeren. U kunt WhatsIsMyIP gebruiken om uw IP-adres te vinden.
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}")
Verificatie in de code
Verderop in dit artikel meldt u zich aan bij Azure met de Azure CLI om de voorbeeldcode uit te voeren. Als uw account machtigingen heeft voor het maken van resourcegroepen en opslagresources in uw Azure-abonnement, wordt de code uitgevoerd.
Als u dergelijke code in een productiescript wilt gebruiken, kunt u omgevingsvariabelen instellen om een op een service-principal gebaseerde methode voor verificatie te gebruiken. Zie Python-apps verifiëren met Azure-services voor meer informatie. U moet ervoor zorgen dat de service-principal voldoende machtigingen heeft om resourcegroepen en opslagresources in uw abonnement te maken door deze toe te wijzen aan een juiste rol in Azure, bijvoorbeeld de rol Inzender voor uw abonnement.
Referentiekoppelingen voor klassen die in de code worden gebruikt
- ResourceManagementClient (azure.mgmt.resource)
- MySQLManagementClient (azure.mgmt.rdbms.mysql_flexibleservers)
- Server (azure.mgmt.rdbms.mysql_flexibleservers.models)
- ServerVersion (azure.mgmt.rdbms.mysql_flexibleservers.models)
Zie voor PostreSQL-databaseserver:
4: Het script uitvoeren
Als u dat nog niet hebt gedaan, meldt u zich aan bij Azure met behulp van de Azure CLI:
az login
Stel de
AZURE_SUBSCRIPTION_ID
enPUBLIC_IP_ADDRESS
omgevingsvariabelen in. U kunt de opdracht az account show uitvoeren om uw abonnements-id op te halen uit deid
eigenschap in de uitvoer. U kunt WhatsIsMyIP gebruiken om uw IP-adres te vinden.U kunt desgewenst de
DB_SERVER_NAME
variabelen ,DB_ADMIN_NAME
enDB_ADMIN_PASSWORD
omgevingsvariabelen instellen. Anders worden standaardwaarden voor code gebruikt.Voer het script uit:
python provision_db.py
5: Een record invoegen en een query uitvoeren op de database
Maak een bestand met de naam use_db.py met de volgende code. Noteer de afhankelijkheden van de DB_SERVER_NAME
, DB_ADMIN_NAME
en DB_ADMIN_PASSWORD
omgevingsvariabelen. U krijgt deze waarden uit de uitvoer van het uitvoeren van de vorige code provision_db.py of in de code zelf.
Deze code werkt alleen voor MySQL; u verschillende bibliotheken voor PostgreSQL gebruikt.
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()
Al deze code maakt gebruik van de api mysql.connector. Het enige azure-specifieke onderdeel is het volledige hostdomein voor MySQL-server (mysql.database.azure.com).
Download vervolgens het certificaat dat nodig is om via TSL/SSL te communiceren met uw Azure Database for MySQL-server en https://www.digicert.com/CACerts/BaltimoreCyberTrustRoot.crt.pem sla het certificaatbestand op in dezelfde map als het Python-bestand. Zie Een SSL-certificaat verkrijgen in de documentatie van Azure Database for MySQL voor meer informatie.
Voer ten slotte de code uit:
python use_db.py
Als er een foutbericht wordt weergegeven dat het IP-adres van de client niet is toegestaan, controleert u of u de omgevingsvariabele PUBLIC_IP_ADDRESS
juist hebt gedefinieerd. Als u de MySQL-server al met het verkeerde IP-adres hebt gemaakt, kunt u een andere server toevoegen in Azure Portal. Selecteer in de portal de MySQL-server en selecteer vervolgens Verbindingsbeveiliging. Voeg het IP-adres van uw werkstation toe aan de lijst met toegestane IP-adressen.
6: Resources opschonen
Voer de opdracht az group delete uit als u de resourcegroep en opslagresources die in dit voorbeeld zijn gemaakt, niet hoeft te behouden.
Voor resourcegroepen worden geen doorlopende kosten in uw abonnement in rekening gebracht, maar resources, zoals opslagaccounts, in de resourcegroep worden mogelijk nog steeds kosten in rekening gebracht. Het is een goede gewoonte om een groep op te schonen die u niet actief gebruikt. Met --no-wait
het argument kan de opdracht onmiddellijk worden geretourneerd in plaats van te wachten tot de bewerking is voltooid.
az group delete -n PythonAzureExample-DB-rg --no-wait
U kunt ook de ResourceManagementClient.resource_groups.begin_delete
methode gebruiken om een resourcegroep uit code te verwijderen. De code in voorbeeld: Een resourcegroep maken laat het gebruik zien.
Ter referentie: equivalente Azure CLI-opdrachten
De volgende Azure CLI-opdrachten voeren dezelfde inrichtingsstappen uit als het Python-script. Gebruik az postgres flexible-server
opdrachten voor een PostgreSQL-database.
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
Zie ook
- Voorbeeld: Een resourcegroep maken
- Voorbeeld: Resourcegroepen weergeven in een abonnement
- Voorbeeld: Azure Storage maken
- Voorbeeld: Azure Storage gebruiken
- Voorbeeld: Een web-app maken en implementeren
- Voorbeeld: Een virtuele machine maken
- Azure Managed Disks gebruiken met virtuele machines
- Een korte enquête over de Azure SDK voor Python voltooien