Быстрый старт: Повторяемые развёртывания с использованием драйвера 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 libstdc++

Создание базы данных 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>=1.16.0",
        "python-dotenv>=1.1.1",
        "rich>=14.1.0",
    ]
    
  3. Обновите значение description.

    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. Сохраните и закройте .gitignore.

  3. В текущем каталоге создайте новый файл с именем .env.

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

    SQL_CONNECTION_STRING="Server=<server>;Database=<database>;Encrypt=yes;TrustServerCertificate=no;Authentication=ActiveDirectoryInteractive"
    

    Important

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

    Строка строка подключения зависит от типа SQL-базы данных, к которой вы подключаетесь. Для База данных SQL Azure или SQL database in Fabric используйте строку подключения ODBC с вкладки строк подключения и настройте тип аутентификации под ваш сценарий. Для получения дополнительной информации о синтаксисе строка подключения см. раздел Connection strings for mssql-python.

    Подсказка

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

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

  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 файл. Воссоздайте виртуальную среду при первом запуске и передайте секреты через целевую среду.