Пример. Создание базы данных с помощью библиотек Azure
В этом примере показано, как использовать библиотеки управления пакетом SDK Azure в скрипте Python для создания База данных Azure для MySQL гибкого экземпляра сервера и базы данных. Здесь также показан простой скрипт для запроса в базу данных с помощью библиотеки mysql-connector (не входит в пакет SDK для Azure). Вы можете использовать аналогичный код для создания База данных Azure для PostgreSQL гибкого экземпляра сервера и базы данных.
Эквивалентные команды Azure CLI приведены далее в этой статье. Если вы предпочитаете использовать портал Azure, см. статью "Создание сервера MySQL" или "Создание сервера PostgreSQL".
Все описанные в этой статье команды работают одинаково как в Bash для Linux или macOS, так и в командных оболочках для Windows, если не указано иное.
1. Настройка локальной среды разработки
Если вы еще не сделали этого, настройте среду, в которой можно запустить код. Ниже приведено несколько вариантов:
Настройте виртуальную среду Python с помощью
venv
или выбранного средства. Вы можете создать виртуальную среду локально или в Azure Cloud Shell и запустить код там. Обязательно активируйте виртуальную среду, чтобы начать использовать ее.Используйте среду conda.
Используйте контейнер разработки в Visual Studio Code или GitHub Codespaces.
2. Установка необходимых пакетов библиотек Azure
Создайте файл requirements.txt со следующим содержимым.
azure-mgmt-resource
azure-mgmt-rdbms
azure-identity
mysql-connector-python
В терминале с активированной виртуальной средой установите требования:
pip install -r requirements.txt
Примечание.
В Windows попытка установить библиотеку mysql в 32-разрядную библиотеку Python приведет к ошибке из-за файла mysql.h. В этом случае установите 64-разрядную версию Python и повторите попытку.
3. Написание кода для создания базы данных
Создайте файл Python с именем provision_db.py с приведенным ниже содержимым. Подробные объяснения даны в комментариях. В частности, укажите переменные среды для AZURE_SUBSCRIPTION_ID
и PUBLIC_IP_ADDRESS
. Последняя переменная — это IP-адрес рабочей станции для выполнения этого примера. Вы можете использовать WhatsIsMyIP для поиска 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}")
Проверка подлинности в коде
Далее в этой статье вы войдите в Azure с помощью Azure CLI, чтобы запустить пример кода. Если у вашей учетной записи есть разрешения на создание групп ресурсов и ресурсов хранилища в подписке Azure, код будет успешно выполняться.
Чтобы использовать такой код в рабочем скрипте, можно задать переменные среды для использования метода на основе субъекта-службы для проверки подлинности. Дополнительные сведения см. в статье "Проверка подлинности приложений Python с помощью служб Azure". Необходимо убедиться, что субъект-служба имеет достаточные разрешения для создания групп ресурсов и ресурсов хранилища в подписке, назначив ей соответствующую роль в Azure, например роль участника в подписке.
Ссылки на справку о классах, используемых в коде
- ResourceManagementClient (azure.mgmt.resource)
- MySQLManagementClient (azure.mgmt.rdbms.mysql_flexibleservers)
- Сервер (azure.mgmt.rdbms.mysql_flexibleservers.models)
- ServerVersion (azure.mgmt.rdbms.mysql_flexibleservers.models)
Сведения о сервере базы данных PostreSQL см. в статье:
4. Запуск скрипта
Если вы еще не сделали этого, войдите в Azure с помощью Azure CLI:
az login
AZURE_SUBSCRIPTION_ID
Задайте переменные среды иPUBLIC_IP_ADDRESS
среды. Вы можете запустить команду az account show , чтобы получить идентификатор подписки изid
свойства в выходных данных. Вы можете использовать WhatsIsMyIP для поиска IP-адреса.При необходимости задайте
DB_SERVER_NAME
DB_ADMIN_NAME
переменные среды иDB_ADMIN_PASSWORD
переменные среды; в противном случае используются значения по умолчанию кода.Запустите скрипт:
python provision_db.py
5. Вставка записи и запрос базы данных
Создайте файл с именем use_db.py с указанным ниже кодом. Обратите внимание на зависимости от DB_SERVER_NAME
DB_ADMIN_NAME
переменных среды и DB_ADMIN_PASSWORD
среды. Эти значения вы получите из выходных данных выполнения предыдущего кода provision_db.py или самого кода.
Этот код работает только для MySQL; вы используете разные библиотеки для 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()
Везде в этом коде используется API mysql.connector. Единственной частью, относящейся к Azure, является основной домен узла для сервера MySQL (mysql.database.azure.com).
Затем скачайте сертификат, необходимый для обмена данными по протоколу TSL/SSL с сервером База данных Azure для MySQL из https://www.digicert.com/CACerts/BaltimoreCyberTrustRoot.crt.pem и сохраните файл сертификата в той же папке, что и файл Python. Дополнительные сведения см. в статье "Получение SSL-сертификата" в документации по База данных Azure для MySQL.
Наконец, запустите код:
python use_db.py
Если вы видите ошибку, которую ip-адрес клиента не разрешен, убедитесь, что вы правильно определили переменную PUBLIC_IP_ADDRESS
среды. Если вы уже создали сервер MySQL с неправильным IP-адресом, можно добавить другой в портал Azure. На портале выберите сервер MySQL и выберите безопасность подключения. Добавьте IP-адрес рабочей станции в список разрешенных IP-адресов.
6. Очистка ресурсов
Выполните команду az group delete, если вам не нужно хранить группу ресурсов и ресурсы хранилища, созданные в этом примере.
Группы ресурсов не несут никаких текущих расходов в подписке, но ресурсы, такие как учетные записи хранения, в группе ресурсов могут продолжать взиматься плата. Рекомендуется очистить любую группу, которую вы не используете. Аргумент --no-wait
позволяет команде выполнять возврат без задержки, не ожидая завершения операции.
az group delete -n PythonAzureExample-DB-rg --no-wait
Для удаления группы ресурсов с помощью кода также можно использовать метод ResourceManagementClient.resource_groups.begin_delete
. Код в примере: создание группы ресурсов демонстрирует использование.
Для справки: аналогичные команды Azure CLI
С помощью следующих команд Azure CLI выполняются такие же действия по подготовке, как и в скрипте Python. Для базы данных PostgreSQL используйте 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
См. также
- Пример. Создание группы ресурсов
- Пример. Перечисление групп ресурсов в подписке
- Пример. Создание служба хранилища Azure
- Пример. Использование служба хранилища Azure
- Пример. Создание и развертывание веб-приложения
- Пример. Создание виртуальной машины
- Использование Управляемых дисков Azure с виртуальными машинами
- Пройдите короткий опрос об Azure SDK для Python