Подключение к и запрос База данных SQL Azure с помощью Python и драйвера pyodbc

Применимо к: База данных SQL Azure

В этом кратком руководстве описывается, как подключить приложение к базе данных в База данных SQL Azure и выполнять запросы с помощью Python и драйвера SQL Python — pyodbc. В этом кратком руководстве описан рекомендуемый подход без пароля для подключения к базе данных. Дополнительные сведения о бессерверных подключениях можно узнать в центре без пароля.

Необходимые компоненты

  • Подписка Azure
  • База данных SQL Azure, настроенная с проверкой подлинности Microsoft Entra. Вы можете создать базу данных с помощью краткого руководства по созданию базы данных.
  • Последняя версия Azure CLI.
  • Visual Studio Code с расширением Python.
  • Python 3.8 или более поздней версии. Если вы используете клиентский компьютер Linux, см. раздел "Установка драйвера ODBC".

Настройка базы данных

Безопасные, бессерверные подключения к База данных SQL Azure требуют определенных конфигураций базы данных. Проверьте следующие параметры на логическом сервере в Azure, чтобы правильно подключиться к База данных SQL Azure в локальных и размещенных средах:

  1. Для локальных подключений разработки убедитесь, что логический сервер настроен, чтобы разрешить подключение ip-адреса локального компьютера и других служб Azure:

    • Перейдите на страницу "Сеть " сервера.

    • Переключите переключатель "Выбранные сети", чтобы отобразить дополнительные параметры конфигурации.

    • Выберите " Добавить ip-адрес клиента" (xx.xx.xx.xx.xx), чтобы добавить правило брандмауэра, которое будет включать подключения с адреса IPv4 локального компьютера. Кроме того, можно выбрать + Добавить правило брандмауэра, чтобы ввести конкретный IP-адрес.

    • Убедитесь, что установлен флажок разрешить службам и ресурсам Azure доступ к этому серверу .

      Снимок экрана: настройка правил брандмауэра.

      Предупреждение

      Включение доступа к этому параметру сервера служб и ресурсов Azure не является рекомендуемой практикой безопасности для рабочих сценариев. Реальные приложения должны реализовать более безопасные подходы, такие как более строгие ограничения брандмауэра или конфигурации виртуальной сети.

      Дополнительные сведения о конфигурациях безопасности базы данных см. в следующих ресурсах:

  2. На сервере также должна быть включена проверка подлинности Microsoft Entra и назначена учетная запись администратора Microsoft Entra. Для локальных подключений к разработке учетная запись администратора Microsoft Entra должна быть учетной записью, с помощью azure CLI или Visual Studio. Вы можете проверить, включена ли проверка подлинности Microsoft Entra на странице идентификатора Microsoft Entra на логическом сервере.

    Снимок экрана: включение проверки подлинности Microsoft Entra.

  3. Если вы используете личную учетную запись Azure, убедитесь, что настроена настройка Microsoft Entra и настроена для База данных SQL Azure, чтобы назначить свою учетную запись администратором сервера. Если вы используете корпоративную учетную запись, идентификатор Microsoft Entra, скорее всего, будет настроен для вас.

Создание проекта

Создайте проект Python с помощью Visual Studio Code.

  1. Откройте Visual Studio Code и создайте новую папку для проекта и измените его.

    mkdir python-sql-azure
    cd python-sql-azure
    
  2. Создайте виртуальную среду для приложения.

    py -m venv .venv
    .venv\scripts\activate
    
  3. Создайте новый файл Python с именем app.py.

Установка драйвера pyodbc

Чтобы подключиться к База данных SQL Azure с помощью Python, установите pyodbc драйвер. Этот пакет выступает в качестве поставщика данных для подключения к базам данных, выполнения команд и получения результатов. В этом кратком руководстве также вы устанавливаете flaskи pydantic uvicornпакеты для создания и запуска API.

Дополнительные сведения и конкретные инструкции по установке pyodbc драйвера во всех операционных системах см. в разделе "Настройка среды разработки для разработки pyodbc Python".

  1. Создайте файл requirements.txt со следующими строками:

    pyodbc
    fastapi
    uvicorn[standard]
    pydantic
    azure-identity
    
  2. Установите требования.

    pip install -r requirements.txt
    

Настройка локального строка подключения

Для локальной разработки и подключения к База данных SQL Azure добавьте следующую AZURE_SQL_CONNECTIONSTRING переменную среды. Замените <database-server-name> <database-name> заполнители собственными значениями. Примеры переменных среды отображаются для оболочки Bash.

Интерактивная проверка подлинности предоставляет параметр без пароля при локальном запуске.

В Windows интерактивная проверка подлинности Microsoft Entra может использовать технологию многофакторной проверки подлинности Microsoft Entra для настройки подключения. В этом режиме, указав идентификатор входа, запускается диалоговое окно проверки подлинности Azure и позволяет пользователю вводить пароль для завершения подключения.

export AZURE_SQL_CONNECTIONSTRING='Driver={ODBC Driver 18 for SQL Server};Server=tcp:<database-server-name>.database.windows.net,1433;Database=<database-name>;Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30'

Дополнительные сведения см. в разделе "Использование идентификатора Записи Майкрософт" с драйвером ODBC. Если вы используете этот параметр, найдите окно, которое запрашивает учетные данные.

Сведения о создании строка подключения можно получить из портал Azure:

  1. Перейдите на сервер SQL Server Azure, выберите страницу баз данных SQL, чтобы найти имя базы данных и выбрать базу данных.

  2. В базе данных перейдите на страницу строк подключения, чтобы получить строка подключения сведения. Перейдите на вкладку ODBC .

Примечание.

Если вы установили Azure Arc и связали его с подпиской Azure, вы также можете использовать подход к управляемому удостоверению, показанный для приложения, развернутого в Служба приложений.

Добавление кода для подключения к База данных SQL Azure

В папке проекта создайте файл app.py и добавьте пример кода. Этот код создает API, который:

  • Извлекает База данных SQL Azure строка подключения из переменной среды.
  • Создает таблицу Persons в базе данных во время запуска (только для сценариев тестирования).
  • Определяет функцию для получения всех Person записей из базы данных.
  • Определяет функцию для получения одной Person записи из базы данных.
  • Определяет функцию для добавления новых Person записей в базу данных.
import os
import pyodbc, struct
from azure import identity

from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel

class Person(BaseModel):
    first_name: str
    last_name: Union[str, None] = None
    
connection_string = os.environ["AZURE_SQL_CONNECTIONSTRING"]

app = FastAPI()

@app.get("/")
def root():
    print("Root of Person API")
    try:
        conn = get_conn()
        cursor = conn.cursor()

        # Table should be created ahead of time in production app.
        cursor.execute("""
            CREATE TABLE Persons (
                ID int NOT NULL PRIMARY KEY IDENTITY,
                FirstName varchar(255),
                LastName varchar(255)
            );
        """)

        conn.commit()
    except Exception as e:
        # Table may already exist
        print(e)
    return "Person API"

@app.get("/all")
def get_persons():
    rows = []
    with get_conn() as conn:
        cursor = conn.cursor()
        cursor.execute("SELECT * FROM Persons")

        for row in cursor.fetchall():
            print(row.FirstName, row.LastName)
            rows.append(f"{row.ID}, {row.FirstName}, {row.LastName}")
    return rows

@app.get("/person/{person_id}")
def get_person(person_id: int):
    with get_conn() as conn:
        cursor = conn.cursor()
        cursor.execute("SELECT * FROM Persons WHERE ID = ?", person_id)

        row = cursor.fetchone()
        return f"{row.ID}, {row.FirstName}, {row.LastName}"

@app.post("/person")
def create_person(item: Person):
    with get_conn() as conn:
        cursor = conn.cursor()
        cursor.execute(f"INSERT INTO Persons (FirstName, LastName) VALUES (?, ?)", item.first_name, item.last_name)
        conn.commit()

    return item

def get_conn():
    credential = identity.DefaultAzureCredential(exclude_interactive_browser_credential=False)
    token_bytes = credential.get_token("https://database.windows.net/.default").token.encode("UTF-16-LE")
    token_struct = struct.pack(f'<I{len(token_bytes)}s', len(token_bytes), token_bytes)
    SQL_COPT_SS_ACCESS_TOKEN = 1256  # This connection option is defined by microsoft in msodbcsql.h
    conn = pyodbc.connect(connection_string, attrs_before={SQL_COPT_SS_ACCESS_TOKEN: token_struct})
    return conn

Предупреждение

В примере кода показаны необработанные инструкции SQL, которые не следует использовать в рабочем коде. Вместо этого используйте пакет реляционного сопоставителя объектов (ORM), например SqlAlchemy , который создает более безопасный уровень объектов для доступа к базе данных.

Локальный запуск и проверка приложения

Приложение готово к локальному тестированию.

  1. app.py Запустите файл в Visual Studio Code.

    uvicorn app:app --reload
    
  2. На странице пользовательского интерфейса Swagger для приложения http://127.0.0.1:8000/docsразверните метод POST и выберите "Попробовать".

    Вы также можете использовать / redoc , чтобы просмотреть другую форму созданной документации для API.

  3. Измените пример JSON, чтобы включить значения для имени и фамилии. Выберите "Выполнить" , чтобы добавить новую запись в базу данных. API возвращает успешный ответ.

  4. Разверните метод GET на странице пользовательского интерфейса Swagger и выберите "Попробовать". Выберите "Выполнить" и возвращается только что созданный пользователь.

Развертывание в Службу приложений Azure

Приложение готово к развертыванию в Azure.

  1. Создайте файл start.sh, чтобы gunicorn в службе приложение Azure может запускать uvicorn. Start.sh имеет одну строку:

    gunicorn -w 4 -k uvicorn.workers.UvicornWorker app:app
    
  2. Используйте az webapp up для развертывания кода в Служба приложений. (Этот параметр -dryrun можно использовать для просмотра того, что выполняет команда, не создавая ресурс.)

    az webapp up \
        --resource-group <resource-group-name> \
        --name <web-app-name>         
    
  3. Используйте команду az webapp config set, чтобы настроить Служба приложений для использования файла start.sh.

    az webapp config set \
        --resource-group <resource-group-name> \
        --name <web-app-name> \
        --startup-file start.sh
    
  4. Используйте команду az webapp identity assign, чтобы включить управляемое удостоверение, назначаемое системой, для Служба приложений.

    az webapp identity assign \
        --resource-group <resource-group-name> \
        --name <web-app-name>
    

    В этом кратком руководстве для демонстрации используется управляемое удостоверение, назначаемое системой. Управляемое удостоверение, назначаемое пользователем, более эффективно в более широком спектре сценариев. Дополнительные сведения см . в рекомендациях по рекомендациям по управляемому удостоверению. Пример использования управляемого удостоверения, назначаемого пользователем, с pyodbc см. в статье "Миграция приложения Python на использование бессерверных подключений с База данных SQL Azure".

Подключение Служба приложений к База данных SQL Azure

В разделе "Настройка базы данных" настроена сеть и проверка подлинности Microsoft Entra для сервера базы данных SQL Azure. В этом разделе описана настройка базы данных и настройка Служба приложений с помощью строка подключения для доступа к серверу базы данных.

Для выполнения этих команд можно использовать любое средство или интегрированную среду разработки, которые могут подключаться к База данных SQL Azure, включая SQL Server Management Studio (SSMS), Azure Data Studio и Visual Studio Code с расширением mssql SQL Server. Кроме того, можно использовать портал Azure, как описано в кратком руководстве. Используйте редактор запросов портал Azure для запроса База данных SQL Azure.

  1. Добавьте пользователя в База данных SQL Azure с командами SQL, чтобы создать пользователя и роль для доступа без пароля.

    CREATE USER [<web-app-name>] FROM EXTERNAL PROVIDER
    ALTER ROLE db_datareader ADD MEMBER [<web-app-name>]
    ALTER ROLE db_datawriter ADD MEMBER [<web-app-name>]
    

    Дополнительные сведения см. в статье Пользователи автономной базы данных — создание переносимой базы данных. Пример, показывающий тот же принцип, но примененный к виртуальной машине Azure, см. в руководстве . Использование управляемого удостоверения, назначаемого системой Виртуальной машины Windows, для доступа к SQL Azure. Дополнительные сведения о назначенных ролях см. в разделе "Роли фиксированной базы данных".

    Если отключить и включить управляемое удостоверение, назначаемое системой, Служба приложений, удалите его и повторно создайте. Запустите и повторно запустите DROP USER [<web-app-name>] CREATE команды и ALTER команды. Чтобы просмотреть пользователей, используйте SELECT * FROM sys.database_principals.

  2. Используйте команду az webapp config appsettings set, чтобы добавить параметр приложения для строка подключения.

    az webapp config appsettings set \
        --resource-group <resource-group-name> \
        --name <web-app-name> \
        --settings AZURE_SQL_CONNECTIONSTRING="<connection-string>"
    

    Для развернутого приложения строка подключения должны выглядеть следующим образом:

    Driver={ODBC Driver 18 for SQL Server};Server=tcp:<database-server-name>.database.windows.net,1433;Database=<database-name>;Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30
    

    <dabaser-server-name> Заполните значения и <database-name> значения.

    Без пароля строка подключения не содержит имя пользователя или пароль. Вместо этого, когда приложение выполняется в Azure, код используется DefaultAzureCredential из библиотеки удостоверений Azure для получения маркера для использования pyodbc.

Тестирование развернутого приложения

Перейдите по URL-адресу приложения, чтобы проверить, работает ли подключение к База данных SQL Azure. URL-адрес приложения можно найти на странице обзора Служба приложений.

https://<web-app-name>.azurewebsites.net

Добавьте /docs к URL-адресу, чтобы просмотреть пользовательский интерфейс Swagger и проверить методы API.

Поздравляем! Теперь приложение подключено к База данных SQL Azure как в локальных, так и в размещенных средах.