Exemplo: Usar as bibliotecas do Azure para criar um banco de dados
Este exemplo demonstra como usar as bibliotecas de gerenciamento do SDK do Azure em um script Python para criar um Banco de Dados do Azure para MySQL, instância de servidor flexível e banco de dados. Ele também fornece um script simples para consultar o banco de dados usando a biblioteca mysql-connector (não parte do SDK do Azure). Você pode usar um código semelhante para criar um Banco de Dados do Azure para PostgreSQL, instância de servidor flexível e banco de dados.
Os comandos equivalentes da CLI do Azure estão disponíveis mais adiante neste artigo. Se preferir usar o portal do Azure, consulte Criar um servidor MySQL ou Criar um servidor PostgreSQL.
Todos os comandos neste artigo funcionam da mesma forma em shells de comando Linux/macOS bash e Windows, a menos que indicado.
1: Configure seu ambiente de desenvolvimento local
Se ainda não o fez, configure um ambiente onde possa executar o código. Seguem-se algumas opções:
Configure um ambiente virtual Python usando
venv
ou sua ferramenta de escolha. Você pode criar o ambiente virtual localmente ou no Azure Cloud Shell e executar o código lá. Certifique-se de ativar o ambiente virtual para começar a usá-lo.Use um ambiente de conda.
Use um contêiner de desenvolvimento no Visual Studio Code ou GitHub Codespaces.
2: Instale os pacotes de biblioteca do Azure necessários
Crie um arquivo chamado requirements.txt com o seguinte conteúdo:
azure-mgmt-resource
azure-mgmt-rdbms
azure-identity
mysql-connector-python
Em um terminal com o ambiente virtual ativado, instale os requisitos:
pip install -r requirements.txt
Nota
No Windows, tentar instalar a biblioteca mysql em uma biblioteca Python de 32 bits produz um erro sobre o arquivo mysql.h . Nesse caso, instale uma versão de 64 bits do Python e tente novamente.
3: Escreva código para criar o banco de dados
Crie um arquivo Python chamado provision_db.py com o código a seguir. Os comentários explicam os detalhes. Em particular, especifique as variáveis de ambiente para AZURE_SUBSCRIPTION_ID
e PUBLIC_IP_ADDRESS
. A última variável é o endereço IP da estação de trabalho para que este exemplo seja executado. Você pode usar o WhatsIsMyIP para encontrar seu endereço 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}")
Autenticação no código
Mais adiante neste artigo, você entra no Azure com a CLI do Azure para executar o código de exemplo. Se sua conta tiver permissões para criar grupos de recursos e recursos de armazenamento em sua assinatura do Azure, o código será executado com êxito.
Para usar esse código em um script de produção, você pode definir variáveis de ambiente para usar um método baseado em entidade de serviço para autenticação. Para saber mais, consulte Como autenticar aplicativos Python com serviços do Azure. Você precisa garantir que a entidade de serviço tenha permissões suficientes para criar grupos de recursos e recursos de armazenamento em sua assinatura, atribuindo-lhe uma função apropriada no Azure, por exemplo, a função de Colaborador em sua assinatura.
Links de referência para classes usadas no código
- ResourceManagementClient (azure.mgmt.resource)
- MySQLManagementClient (azure.mgmt.rdbms.mysql_flexibleservers)
- Servidor (azure.mgmt.rdbms.mysql_flexibleservers.models)
- ServerVersion (azure.mgmt.rdbms.mysql_flexibleservers.models)
Para o servidor de banco de dados PostreSQL, consulte:
4: Execute o script
Se ainda não o fez, inicie sessão no Azure utilizando a CLI do Azure:
az login
Defina as variáveis e
PUBLIC_IP_ADDRESS
deAZURE_SUBSCRIPTION_ID
ambiente. Você pode executar o comando az account show para obter seu ID de assinatura daid
propriedade na saída. Você pode usar o WhatsIsMyIP para encontrar seu endereço IP.Opcionalmente, defina as
DB_SERVER_NAME
variáveis ,DB_ADMIN_NAME
eDB_ADMIN_PASSWORD
ambiente, caso contrário, os padrões de código serão usados.Execute o script:
python provision_db.py
5: Inserir um registo e consultar a base de dados
Crie um arquivo chamado use_db.py com o código a seguir. Observe as dependências nas DB_SERVER_NAME
variáveis , DB_ADMIN_NAME
e ambiente DB_ADMIN_PASSWORD
. Você obtém esses valores da saída da execução do código anterior provision_db.py ou no próprio código.
Este código funciona apenas para MySQL; você usa bibliotecas diferentes para 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()
Todo esse código usa a API mysql.connector. A única parte específica do Azure é o domínio de host completo para o servidor MySQL (mysql.database.azure.com).
Em seguida, baixe o certificado necessário para se comunicar por TSL/SSL com seu banco de dados do Azure para o servidor MySQL e salve o arquivo de https://www.digicert.com/CACerts/BaltimoreCyberTrustRoot.crt.pem certificado na mesma pasta do arquivo Python. Para obter mais informações, consulte Obter um certificado SSL na documentação do Banco de Dados do Azure para MySQL.
Finalmente, execute o código:
python use_db.py
Se você vir um erro informando que o endereço IP do cliente não é permitido, verifique se você definiu a variável PUBLIC_IP_ADDRESS
de ambiente corretamente. Se você já criou o servidor MySQL com o endereço IP errado, pode adicionar outro no portal do Azure. No portal, selecione o servidor MySQL e, em seguida, selecione Segurança de conexão. Adicione o endereço IP da sua estação de trabalho à lista de endereços IP permitidos.
6: Limpar recursos
Execute o comando az group delete se não precisar manter o grupo de recursos e os recursos de armazenamento criados neste exemplo.
Os grupos de recursos não incorrem em encargos contínuos na sua subscrição, mas os recursos, como contas de armazenamento, no grupo de recursos podem continuar a incorrer em encargos. É uma boa prática limpar qualquer grupo que você não esteja usando ativamente. O --no-wait
argumento permite que o comando retorne imediatamente em vez de esperar que a operação seja concluída.
az group delete -n PythonAzureExample-DB-rg --no-wait
Você também pode usar o ResourceManagementClient.resource_groups.begin_delete
método para excluir um grupo de recursos do código. O código em Exemplo: Criar um grupo de recursos demonstra o uso.
Para referência: comandos equivalentes da CLI do Azure
Os seguintes comandos da CLI do Azure concluem as mesmas etapas de provisionamento que o script Python. Para um banco de dados PostgreSQL, use az postgres flexible-server
comandos.
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
Consulte também
- Exemplo: Criar um grupo de recursos
- Exemplo: Listar grupos de recursos em uma assinatura
- Exemplo: Criar armazenamento do Azure
- Exemplo: Usar o Armazenamento do Azure
- Exemplo: Criar e implantar um aplicativo Web
- Exemplo: Criar uma máquina virtual
- Usar Discos Gerenciados do Azure com máquinas virtuais
- Conclua uma breve pesquisa sobre o SDK do Azure para Python