Быстрый старт: Повторяемые развёртывания с использованием драйвера mssql-python для Python

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

Драйвер mssql-python не требует внешних зависимостей на компьютерах Windows. Драйвер устанавливает все, что требуется с одной pip установкой, что позволяет использовать самую последнюю версию драйвера в новых сценариях без нарушения работы других сценариев, для обновления и тестирования которых у вас нет времени.

Документация | Исходный код mssql-python | Пакет (PyPI) | uv

Предпосылки

Установите единовременные предварительные условия для операционной системы. Пользователи Windows могут пропустить этот шаг. Для полной информации о платформе см. Установить mssql-python.

apk add libtool krb5-libs krb5-dev

Создание базы данных SQL

Создайте или подключитесь к SQL-базе данных на одной из следующих платформ:

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

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

  1. Откройте командную строку в каталоге разработки. Если у вас его нет, создайте новую директорию, например python или scripts. Избегайте папок на OneDrive, так как синхронизация может мешать управлению виртуальной средой.

  2. Создайте новый проект с uv.

    uv init mssql-python-repeatable-qs
    cd mssql-python-repeatable-qs
    

Добавление зависимостей

В том же каталоге установите mssql-pythonи python-dotenvrich пакеты.

uv add mssql-python python-dotenv rich

Запустите Visual Studio Code.

В том же каталоге выполните следующую команду.

code .

Обновление pyproject.toml

  1. Pyproject.toml содержит метаданные проекта. Откройте файл в избранном редакторе.

  2. Просмотрите содержимое файла. Он должен быть похож на этот пример. Обратите внимание на версию Python и зависимость для mssql-python; используйте >=, чтобы указать минимальную версию. Если вы предпочитаете точную версию, измените >= на == перед номером версии. Разрешённые версии каждого пакета хранятся в uv.lock. Файл блокировки гарантирует, что разработчики, работающие над проектом, используют единообразные версии пакетов. Он также гарантирует, что при распространении пакета пользователям используется тот же набор версий пакетов. Коммитируйте оба pyproject.toml и uv.lock, проверяйте изменения в файлах блокировки в pull requests и запускайте одобренный организацией сканер зависимостей в CI. Не редактируйте uv.lock файл напрямую.

    [project]
    name = "mssql-python-repeatable-qs"
    version = "0.1.0"
    description = "Add your description here"
    readme = "README.md"
    requires-python = ">=3.11"
    dependencies = [
        "mssql-python>=0.10.0",
        "python-dotenv>=1.1.1",
        "rich>=14.1.0",
    ]
    
  3. Обновите описание, чтобы быть более описательным.

    description = "Connects to a SQL database using mssql-python"
    
  4. Сохраните и закройте файл.

Обновление main.py

  1. Откройте файл с именем main.py. Он должен быть похож на этот пример.

    def main():
        print("Hello from mssql-python-repeatable-qs!")
    
    if __name__ == "__main__":
        main()
    
  2. В верхней части файла добавьте следующие импорты перед строкой с def main().

    Подсказка

    Если в Visual Studio Code возникли проблемы с разрешением пакетов, необходимо обновить интерпретатор для использования виртуальной среды.

    from os import getenv
    from dotenv import load_dotenv
    from mssql_python import connect, Connection, Cursor
    from rich.console import Console
    from rich.progress import Progress, SpinnerColumn, TextColumn
    from rich.table import Table
    from argparse import ArgumentParser
    from time import sleep
    
  3. Между импортом и строкой с def main(), добавьте следующий код.

    def get_results(sleep_time: int = 0) -> None:
     with Progress(
         SpinnerColumn(),
         TextColumn("[progress.description]{task.description}"),
         transient=True,
     ) as progress:
         task = progress.add_task(
             description="Connecting to SQL...")
    
         cursor = query_sql()
    
         # Simulate a slow connection for demo purposes
         sleep(sleep_time)
    
         progress.update(task, description="Formatting results...")
    
         table = Table(title="Orders by Customer")
         # https://rich.readthedocs.io/en/stable/appendix/colors.html
         table.add_column("Customer ID", style="bright_blue", justify="center")
         table.add_column("Company Name", style="bright_white", justify="left")
         table.add_column("Order Count", style="bold green", justify="right")
    
         records = cursor.fetchall()
         for r in records:
             table.add_row(f"{r.CustomerID}",
                           f"{r.CompanyName}", f"{r.OrderCount}")
    
         if cursor:
             cursor.close()
    
         # Simulate a slow connection for demo purposes
         sleep(sleep_time)
    
         progress.stop()
    
         Console().print(table)
    
  4. Между импортом и def get_results(sleep_time: int = 0) -> None:добавьте этот код.

    _connection = None
    
    def get_connection() -> Connection:
       global _connection
       if not _connection:
           load_dotenv()
           _connection = connect(getenv("SQL_CONNECTION_STRING"))  # type: ignore
       return _connection
    
    def query_sql() -> Cursor:
    
       SQL_QUERY = """
         SELECT TOP 5
         c.CustomerID,
         c.CompanyName,
         COUNT(soh.SalesOrderID) AS OrderCount
         FROM
         SalesLT.Customer AS c
         LEFT OUTER JOIN SalesLT.SalesOrderHeader AS soh
         ON c.CustomerID = soh.CustomerID
         GROUP BY
         c.CustomerID,
         c.CompanyName
         ORDER BY
         OrderCount DESC;
       """
    
       conn = get_connection()
       cursor = conn.cursor()
       cursor.execute(SQL_QUERY)
       return cursor
    
  5. Найдите этот код.

    def main():
        print("Hello from mssql-python-repeatable-qs!")
    
  6. Замените его этим кодом.

    def main() -> None:
       parser = ArgumentParser()
       parser.add_argument("--sleep-time", type=int, default=0,
                           help="Time to sleep in seconds to simulate slow connection")
       args = parser.parse_args()
    
       if args.sleep_time > 0:
           get_results(args.sleep_time)
       else:
           get_results()
    
       if _connection:
           _connection.close()
    
  7. Сохраните и закройте main.py.

Сохранение строки подключения

  1. .gitignore Откройте файл и добавьте исключение для .env файлов. Файл должен быть похож на этот пример. Не забудьте сохранить и закрыть его после завершения.

    # Python-generated files
    __pycache__/
    *.py[oc]
    build/
    dist/
    wheels/
    *.egg-info
    
    # Virtual environments
    .venv
    
    # Connection strings and secrets
    .env
    
  2. В текущем каталоге создайте новый файл с именем .env.

  3. В файле .env добавьте запись для строки подключения с именем SQL_CONNECTION_STRING. Замените пример фактическим значением строки подключения.

    SQL_CONNECTION_STRING="Server=<server_name>;Database=<database_name>;Encrypt=yes;TrustServerCertificate=no;Authentication=ActiveDirectoryInteractive"
    

    Important

    Храните .env локально и вне системы контроля версий. Для CI и развернутых окружений передавайте строку подключения или входящие в неё секреты из хранилища секретов вашей платформы вместо копирования .env между машинами.

    Подсказка

    Строка подключения, используемая здесь, в значительной степени зависит от типа базы данных SQL, к которой вы подключаетесь. Если вы подключаетесь к базе данных SQL Azure или базе данных SQL в Fabric, используйте строку подключения ODBC на вкладке строк подключения. Возможно, вам потребуется настроить тип проверки подлинности в зависимости от вашего сценария. Дополнительные сведения о строках подключения и их синтаксисе см. в справочнике по синтаксису строки подключения.

Использование uv run для выполнения скрипта

Подсказка

На macOS, оба ActiveDirectoryInteractive и ActiveDirectoryDefault работают для проверки подлинности Microsoft Entra. ActiveDirectoryInteractive запрашивает вход при каждом запуске скрипта. Чтобы избежать повторных запросов при входе, войдите один раз через Azure CLI, запустив az login, затем используйте ActiveDirectoryDefault, который повторно использует кэшированный учетный код.

  1. В окне терминала до или в новом окне терминала, открываемом в том же каталоге, выполните следующую команду.

     uv run main.py
    
  2. Теперь давайте снова запустите его, но более медленно, чтобы иметь возможность видеть оба обновления состояния.

     uv run main.py --sleep-time 5
    

    Ниже приведены ожидаемые выходные данные при завершении скрипта.

                             Orders by Customer
    ┏━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━┓
    ┃ Customer ID ┃ Company Name                   ┃ Order Count ┃
    ┡━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━┩
    │    29485    │ Professional Sales and Service │           1 │
    │    29531    │ Remarkable Bike Store          │           1 │
    │    29546    │ Bulk Discount Store            │           1 │
    │    29568    │ Coalition Bike Company         │           1 │
    │    29584    │ Futuristic Bikes               │           1 │
    └─────────────┴────────────────────────────────┴─────────────┘
    
  3. Чтобы развернуть скрипт на другой компьютер, скопируйте файлы проекта, включая pyproject.toml и uv.lock, но не папку .venv или какой-либо локальный .env файл. Воссоздайте виртуальную среду при первом запуске и передайте секреты через целевую среду.

Дальнейшие действия

Используйте эти статьи, чтобы продолжать строить: