Örnek: Veritabanı oluşturmak için Azure kitaplıklarını kullanma

Bu örnekte, MySQL için Azure Veritabanı esnek sunucu örneği ve veritabanı oluşturmak için Python betiğinde Azure SDK yönetim kitaplıklarının nasıl kullanılacağı gösterilmektedir. Ayrıca mysql-connector kitaplığını (Azure SDK'nın parçası değil) kullanarak veritabanını sorgulamak için basit bir betik sağlar. PostgreSQL için Azure Veritabanı esnek bir sunucu örneği ve veritabanı oluşturmak için benzer kodu kullanabilirsiniz.

Eşdeğer Azure CLI komutları bu makalenin devamındadır. Azure portalını kullanmayı tercih ediyorsanız bkz . MySQL sunucusu oluşturma veya PostgreSQL sunucusu oluşturma.

Bu makaledeki tüm komutlar, not edilmediği sürece Linux/macOS bash ve Windows komut kabuklarında aynı şekilde çalışır.

1: Yerel geliştirme ortamınızı ayarlama

Henüz yapmadıysanız kodu çalıştırabileceğiniz bir ortam ayarlayın. Aşağıda bazı seçenekleri görebilirsiniz:

  • Python sanal ortamını yapılandırma. Sanal ortamı yerel olarak veya Azure Cloud Shell'de oluşturabilir ve kodu orada çalıştırabilirsiniz. Kullanmaya başlamak için sanal ortamı etkinleştirdiğinizden emin olun.

  • Conda ortamı kullanın.

  • Visual Studio Code veya GitHub Codespaces'ta Geliştirme Kapsayıcısı kullanın.

2: Gerekli Azure kitaplık paketlerini yükleme

aşağıdaki içeriklere sahip requirements.txt adlı bir dosya oluşturun:

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

Sanal ortamın etkinleştirildiği bir terminalde gereksinimleri yükleyin:

pip install -r requirements.txt

Not

Windows'da, mysql kitaplığını 32 bit Python kitaplığına yüklemeye çalışmak mysql.h dosyasıyla ilgili bir hata oluşturur. Bu durumda Python'ın 64 bit sürümünü yükleyin ve yeniden deneyin.

3: Veritabanını oluşturmak için kod yazma

Aşağıdaki kodla provision_db.py adlı bir Python dosyası oluşturun. Açıklamalar ayrıntıları açıklar. Özellikle ve PUBLIC_IP_ADDRESSiçin AZURE_SUBSCRIPTION_ID ortam değişkenlerini belirtin. İkinci değişken, bu örneğin çalışması için iş istasyonunuzun IP adresidir. IP adresinizi bulmak için WhatsIsMyIP kullanabilirsiniz.

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

Kodda kimlik doğrulaması

Bu makalenin devamında, örnek kodu çalıştırmak için Azure CLI ile Azure'da oturum açarsınız. Hesabınızın Azure aboneliğinizde kaynak grupları ve depolama kaynakları oluşturma izinleri varsa kod başarıyla çalıştırılır.

Bu kodu üretim betiğinde kullanmak için ortam değişkenlerini kimlik doğrulaması için hizmet sorumlusu tabanlı bir yöntem kullanacak şekilde ayarlayabilirsiniz. Daha fazla bilgi edinmek için bkz . Azure hizmetleriyle Python uygulamalarının kimliğini doğrulama. Hizmet sorumlusuna Azure'da uygun bir rol atayarak (örneğin, aboneliğinizdeki Katkıda Bulunan rolü) aboneliğinizde kaynak grupları ve depolama kaynakları oluşturmak için yeterli izinlere sahip olduğundan emin olmanız gerekir.

PostreSQL veritabanı sunucusu için bkz:

4: Betiği çalıştırma

  1. Henüz yapmadıysanız Azure CLI kullanarak Azure'da oturum açın:

    az login
    
  2. AZURE_SUBSCRIPTION_ID ve PUBLIC_IP_ADDRESS ortam değişkenlerini ayarlayın. Çıkıştaki özelliğinden id abonelik kimliğinizi almak için az account show komutunu çalıştırabilirsiniz. IP adresinizi bulmak için WhatsIsMyIP kullanabilirsiniz.

    set AZURE_SUBSCRIPTION_ID=00000000-0000-0000-0000-000000000000
    set PUBLIC_IP_ADDRESS=<Your public IP address>
    
  3. İsteğe bağlı olarak, , DB_ADMIN_NAMEve DB_ADMIN_PASSWORD ortam değişkenlerini ayarlayınDB_SERVER_NAME; aksi takdirde kod varsayılanları kullanılır.

  4. Betiği çalıştırın:

    python provision_db.py
    

5: Kayıt ekleme ve veritabanını sorgulama

Aşağıdaki kodla use_db.py adlı bir dosya oluşturun. , DB_ADMIN_NAMEve DB_ADMIN_PASSWORD ortam değişkenlerine DB_SERVER_NAMEbağımlılıkları not edin. Bu değerleri, önceki kodun provision_db.py veya kodun kendisinde çalıştırma çıkışından alırsınız.

Bu kod yalnızca MySQL için çalışır; PostgreSQL için farklı kitaplıklar kullanırsınız.

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

Bu kodun tümü mysql.connector API'sini kullanır. Azure'a özgü tek bölüm, MySQL sunucusu (mysql.database.azure.com) için tam konak etki alanıdır.

Ardından, MySQL için Azure Veritabanı sunucunuzla https://www.digicert.com/CACerts/BaltimoreCyberTrustRoot.crt.pem TSL/SSL üzerinden iletişim kurmak için gereken sertifikayı indirin ve sertifika dosyasını Python dosyasıyla aynı klasöre kaydedin. Daha fazla bilgi için MySQL için Azure Veritabanı belgelerinde SSL Sertifikası Alma bölümüne bakın.

Son olarak kodu çalıştırın:

python use_db.py

İstemci IP adresinize izin verilmediğini belirten bir hata görürseniz ortam değişkenini PUBLIC_IP_ADDRESS doğru tanımlamış olup olmadığınızı denetleyin. MySQL sunucusunu yanlış IP adresiyle oluşturduysanız Azure portalında başka bir sunucu ekleyebilirsiniz. Portalda MySQL sunucusunu ve ardından Bağlan ion güvenliği'ni seçin. İş istasyonunuzun IP adresini izin verilen IP adresleri listesine ekleyin.

6: Kaynakları temizleme

Bu örnekte oluşturulan kaynak grubunu ve depolama kaynaklarını tutmanız gerekmiyorsa az group delete komutunu çalıştırın.

Kaynak grupları aboneliğinizde devam eden bir ücret ödemez, ancak kaynak grubundaki depolama hesapları gibi kaynaklar ücretlendirilmeye devam edebilir. Etkin olarak kullanmadığınız tüm grupları temizlemek iyi bir uygulamadır. --no-wait bağımsız değişkeni, işlemin bitmesini beklemek yerine komutun hemen döndürülmesini sağlar.

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

Bir kaynak grubunu koddan silmek için yöntemini de kullanabilirsiniz ResourceManagementClient.resource_groups.begin_delete . Örnek: Kaynak grubu oluşturma içindeki kod kullanımı gösterir.

Başvuru için: eşdeğer Azure CLI komutları

Aşağıdaki Azure CLI komutları, Python betiğiyle aynı sağlama adımlarını tamamlar. PostgreSQL veritabanı için komutları kullanın 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

Ayrıca bkz.