Guia de início rápido: implantações repetíveis com o driver mssql-python para Python

Neste guia de início rápido, utiliza uv para gerir as dependências e os ambientes do projeto para um script de Python que se liga a uma base de dados que criou e carregou com dados de exemplo. Utiliza o mssql-python driver do Python para se ligar à sua base de dados e realizar operações básicas, como ler e escrever dados.

O mssql-python driver não requer nenhuma dependência externa em máquinas Windows. O driver instala tudo o que precisa com uma única pip instalação, permitindo que você use a versão mais recente do driver para novos scripts sem quebrar outros scripts que você não tem tempo para atualizar e testar.

Documentação | Código-fonte | Pacote (PyPI) | UV

Pré-requisitos

Pré-requisitos para instalar o sistema operativo

Instale pré-requisitos que devem ser instalados uma única vez específicos do sistema operacional. Os utilizadores do Windows podem saltar este passo. Para detalhes completos da plataforma, consulte Instalar mssql-python.

apk add libtool krb5-libs krb5-dev libstdc++

Criar um banco de dados SQL

Criar ou ligar-se a uma base de dados SQL numa das seguintes plataformas:

Crie o projeto e execute o código

Criar um novo projeto

  1. Abra um prompt de comando no diretório de desenvolvimento. Se não tiver um, crie um novo diretório, como python ou scripts. Evite pastas no seu OneDrive, pois a sincronização pode interferir na gestão do seu ambiente virtual.

  2. Crie um novo projeto com uv.

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

Adicionar dependências

No mesmo diretório, instale os pacotes mssql-python, python-dotenv e rich.

uv add mssql-python python-dotenv rich

Abra o Visual Studio Code.

No mesmo diretório, execute o seguinte comando.

code .

Atualizar pyproject.toml

  1. Abra o pyproject.toml arquivo no editor. Este ficheiro contém os metadados do seu projeto.

  2. Revise o conteúdo do arquivo. Deve ser semelhante a este exemplo. Tenha em atenção a versão e a dependência do Python; para mssql-python, use >= para definir uma versão mínima. Se preferir uma versão exata, altere o >= para == antes do número da versão. As versões resolvidas de cada pacote são armazenadas no uv.lock. O ficheiro de bloqueio garante que os programadores que trabalham no projeto utilizam versões consistentes dos pacotes. Ele também garante que o mesmo conjunto exato de versões de pacote seja usado ao distribuir seu pacote para usuários finais. Faça commit de pyproject.toml e uv.lock, reveja as alterações ao ficheiro lock nos pull requests e execute um verificador de dependências aprovado pela organização em CI. Não edites o uv.lock ficheiro diretamente.

    [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. Atualize o valor description.

    description = "Connects to a SQL database using mssql-python"
    
  4. Salve e feche o arquivo.

Atualizar main.py

  1. Abra o arquivo chamado main.py. Deve ser semelhante a este exemplo.

    def main():
        print("Hello from mssql-python-repeatable-qs!")
    
    if __name__ == "__main__":
        main()
    
  2. No topo do ficheiro, adicione as seguintes importações antes da linha com def main().

    Sugestão

    Se o Visual Studio Code estiver tendo problemas para resolver pacotes, você precisará atualizar o intérprete para usar o ambiente virtual.

    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. Entre as importações e a linha com def main(), adicione o código a seguir.

    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. Entre as importações e def get_results(sleep_time: int = 0) -> None:, adicione este código.

    _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. Encontre este código.

    def main():
        print("Hello from mssql-python-repeatable-qs!")
    
  6. Substitua-o por este código.

    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. Salve e feche main.py.

Salvar a cadeia de conexão

  1. Abra o .gitignore arquivo e adicione uma exclusão para .env arquivos. O seu ficheiro deve ser semelhante ao exemplo seguinte.

    # Python-generated files
    __pycache__/
    *.py[oc]
    build/
    dist/
    wheels/
    *.egg-info
    
    # Virtual environments
    .venv
    
    # Connection strings and secrets
    .env
    
  2. Salve e feche .gitignore.

  3. No diretório atual, crie um novo arquivo chamado .env.

  4. Dentro do .env arquivo, adicione uma entrada para sua cadeia de conexão chamada SQL_CONNECTION_STRING. Substitua os marcadores de posição pelos seus valores reais.

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

    Importante

    Mantenha .env localmente e fora do controlo de código-fonte. Para CI e ambientes de implementação, injete a cadeia de ligação ou os segredos que a compõem a partir do repositório de segredos da sua plataforma, em vez de copiar .env de uma máquina para outra.

    A cadeia de ligação depende do tipo de base de dados SQL a que te estás a ligar. Para Base de Dados SQL do Azure ou base de dados SQL no Fabric, use a cadeia de ligação ODBC do separador cadeia de ligaçãos e ajuste o tipo de autenticação para o seu cenário. Para mais informações sobre a sintaxe das cadeia de ligação, veja Connection strings for mssql-python.

    Sugestão

    No macOS, tanto ActiveDirectoryInteractive como ActiveDirectoryDefault funcionam para a autenticação do Microsoft Entra. ActiveDirectoryInteractive Solicita-te para iniciar sessão sempre que executas o script. Para evitar repetidos prompts de início de sessão, inicie sessão uma vez com o comando CLI do Azureaz login e use ActiveDirectoryDefault. ActiveDirectoryDefault Reutiliza a credencial em cache.

Use uv run para executar o script

  1. Na janela do terminal anterior ou em uma nova janela do terminal aberta no mesmo diretório, execute o seguinte comando.

    uv run main.py
    
  2. Executa o script novamente com um atraso para poderes ver ambas as atualizações de estado.

    uv run main.py --sleep-time 5
    

    Aqui está a saída esperada quando o script for concluído.

                             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. Para implantar o seu script noutra máquina, copie os ficheiros do projeto, incluindo pyproject.toml e uv.lock, mas não a .venv pasta nem qualquer ficheiro local .env . Recrie o ambiente virtual na primeira execução e forneça segredos através do ambiente alvo.