Поделиться через


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

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

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

Предварительные условия

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

Безопасные подключения без паролей к Службам баз данных Azure SQL требуют определённых конфигураций базы данных. Проверьте следующие параметры на логическом сервере в 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 ID вашего логического сервера.

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

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

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

Создайте проект 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.

Установка драйвера mssql-python

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

Замечание

В macOS и Linux перед установкой mssql-pythonтребуются системные зависимости. Смотрите в статье Установка пакета mssql-python для инструкций по конкретной платформе.

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

    mssql-python
    fastapi
    uvicorn[standard]
    pydantic
    python-dotenv
    
  2. Установите требования.

    pip install -r requirements.txt
    

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

Для локальной разработки создайте файл .env в папке вашего проекта для хранения строки подключения. Это помогает исключить учетные данные из кода и системы управления версиями.

  1. В папке проекта создайте новый файл с именем .env.

  2. Добавьте переменную AZURE_SQL_CONNECTIONSTRING строки подключения. Замените заполнители <database-server-name> и <database-name> собственными значениями.

Драйвер mssql-python имеет встроенную поддержку проверки подлинности Microsoft Entra. Authentication Используйте параметр, чтобы указать метод проверки подлинности.

ActiveDirectoryDefault автоматически обнаруживает учетные данные из нескольких источников, не требуя интерактивного входа. Это рекомендуемый вариант для локальной разработки.

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

az login

Затем используйте этот формат строки подключения в .env файле:

AZURE_SQL_CONNECTIONSTRING=Server=<database-server-name>.database.windows.net;Database=<database-name>;Authentication=ActiveDirectoryDefault;Encrypt=yes;TrustServerCertificate=no;

ActiveDirectoryDefault оценивает учетные данные в следующем порядке:

  1. Переменные среды (для учетных данных сервисного принципала)
  2. Управляемое удостоверение (при работе в Azure)
  3. Azure CLI (из az login)
  4. Visual Studio (только для Windows)
  5. Azure PowerShell (из Connect-AzAccount)

Подсказка

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

  • Azure App Service/Functions: использовать ActiveDirectoryMSI (управляемое удостоверение)
  • Интерактивный вход пользователя: ActiveDirectoryInteractive
  • Субъект-служба: использование ActiveDirectoryServicePrincipal

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

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

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

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

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

  • Загружает конфигурацию из .env файла с помощью python-dotenv.
  • Извлекает строку подключения для базы данных "SQL Azure" из переменной окружения.
  • Создает таблицу Persons в базе данных во время запуска (только для сценариев тестирования).
  • Определяет функцию для получения всех Person записей из базы данных.
  • Определяет функцию для получения одной Person записи из базы данных.
  • Определяет функцию для добавления новых Person записей в базу данных.
from os import getenv
from typing import Union
from dotenv import load_dotenv
from fastapi import FastAPI
from pydantic import BaseModel
from mssql_python import connect

load_dotenv()

class Person(BaseModel):
    first_name: str
    last_name: Union[str, None] = None

connection_string = getenv("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("""
            IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'Persons')
            CREATE TABLE Persons (
                ID int NOT NULL PRIMARY KEY IDENTITY,
                FirstName varchar(255),
                LastName varchar(255)
            );
        """)

        conn.commit()
        conn.close()
    except Exception as e:
        # Table might 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("INSERT INTO Persons (FirstName, LastName) VALUES (?, ?)",
                       (item.first_name, item.last_name))
        conn.commit()

    return item

def get_conn():
    """Connect using mssql-python with built-in Microsoft Entra authentication."""
    conn = connect(connection_string)
    conn.setautocommit(True)
    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>
    

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

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

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

Для выполнения этих команд можно использовать любое средство или интегрированную среду разработки, которые могут подключаться к базе данных SQL Azure, включая SQL Server Management Studio (SSMS) и Visual Studio Code с расширением MSSQL. Вы также можете использовать портал 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 для доступа к Azure SQL. Дополнительные сведения о назначенных ролях см. в разделе "Роли фиксированной базы данных".

    Если отключить, а затем включить системное управляемое удостоверение в Службе приложений, тогда удалите пользователя и создайте его снова. Запустите 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>"
    

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

    Server=<database-server-name>.database.windows.net;Database=<database-name>;Authentication=ActiveDirectoryMSI;Encrypt=yes;TrustServerCertificate=no;
    

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

    Без пароля строка подключения не содержит имя пользователя или пароль. Вместо этого при запуске приложения в Azure драйвер mssql-python использует ActiveDirectoryMSI режим проверки подлинности для автоматической проверки подлинности с помощью управляемого удостоверения службы приложений.

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

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

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

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

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