Microsoft Python Driver para SQL Server – mssql-python

mssql-pythoné o driver Python da Microsoft para SQL Server, Banco de Dados SQL do Azure, Instância Gerenciada de SQL do Azure e banco de dados SQL no Microsoft Fabric. Ele usa Conectividade Direta de Banco de Dados (DDBC), então você pode se conectar sem instalar um gerenciador externo de drivers. O driver suporta Python 3.10 ou posterior e está em conformidade com a Especificação 2.0 da API de Banco de Dados Python, além de adicionar melhorias amigáveis para Python no desenvolvimento diário.

Escolha o ponto de partida

Linha de base de produção para SQL do Azure

Use este exemplo como ponto de partida para uma conexão SQL do Azure orientada à produção. Ele lê configurações do ambiente, autentica com identidade gerenciada e habilita a criptografia Tabular Data Stream (TDS) 8.0. Também define tempos limite de login e de consulta por instrução, faz novas tentativas após falhas transitórias com backoff exponencial (uma nova conexão para erros de conexão, a mesma conexão para erros de consulta, como deadlocks), registra os resultados e depende de gerenciadores de contexto para liberar recursos.

As palavras-chave ConnectRetryCount e ConnectRetryInterval na cadeia de conexão habilitam a resiliência a conexões ociosas do SQL Server: o driver reconecta automaticamente, de forma transparente, uma conexão ociosa interrompida. Isso é diferente da nova tentativa no nível da aplicação neste exemplo, que faz uma nova tentativa de uma consulta que falha com um erro transitório, como um deadlock ou tempo limite da consulta. Os dois são complementares, então mantenha os dois.

import logging
import os
import time

import mssql_python

logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s %(levelname)s %(name)s %(message)s",
)
logger = logging.getLogger("app")

# Transient errors that require a fresh connection to recover.
CONNECT_RETRY_ERRORS = frozenset({
    "Timeout expired",
    "Connection timeout expired",
    "Client unable to establish connection",
    "Communication link failure",
    "Connection failure during transaction",
})

# Transient errors that leave the connection usable, such as a deadlock victim
# or a query timeout, so retry on the same connection.
QUERY_RETRY_ERRORS = frozenset({
    "Serialization failure",
    "Timeout expired",
})


def connect_with_retry(conn_str: str, max_attempts: int = 3, login_timeout_s: int = 5) -> mssql_python.Connection:
    """Open a connection, retrying transient failures with exponential backoff."""
    for attempt in range(1, max_attempts + 1):
        try:
            conn = mssql_python.connect(
                conn_str,
                attrs_before={mssql_python.SQL_ATTR_LOGIN_TIMEOUT: login_timeout_s},
            )
            logger.info("connected on attempt %d/%d", attempt, max_attempts)
            return conn
        except mssql_python.OperationalError as exc:
            if exc.driver_error not in CONNECT_RETRY_ERRORS or attempt == max_attempts:
                logger.error("connect failed on attempt %d/%d: %s", attempt, max_attempts, exc.driver_error)
                raise
            delay = 2 ** (attempt - 1)  # 1s, 2s, 4s
            logger.warning(
                "connect attempt %d/%d hit transient error %r; retrying in %ds",
                attempt, max_attempts, exc.driver_error, delay,
            )
            time.sleep(delay)


def execute_with_retry(
    conn: mssql_python.Connection,
    sql: str,
    *params,
    max_attempts: int = 3,
    query_timeout_s: int = 10,
) -> mssql_python.Cursor:
    """Run sql on an open connection and return the ready-to-fetch cursor.

    Retries errors that leave the connection usable so callers don't wrap each
    query in its own function. Pass query values as parameters. Retry only
    idempotent statements; wrap writes in an explicit transaction.
    """
    for attempt in range(1, max_attempts + 1):
        cursor = mssql_python.Cursor(conn, timeout=query_timeout_s)
        try:
            cursor.execute(sql, *params)
            if attempt > 1:
                logger.info("query succeeded on attempt %d/%d", attempt, max_attempts)
            return cursor
        except mssql_python.OperationalError as exc:
            cursor.close()
            if exc.driver_error not in QUERY_RETRY_ERRORS or attempt == max_attempts:
                logger.error("query failed on attempt %d/%d: %s", attempt, max_attempts, exc.driver_error)
                raise
            delay = 2 ** (attempt - 1)  # 1s, 2s, 4s
            logger.warning(
                "query attempt %d/%d hit transient error %r; retrying in %ds",
                attempt, max_attempts, exc.driver_error, delay,
            )
            time.sleep(delay)
    raise RuntimeError("unreachable: the retry loop exits by return or raise")


def main() -> None:
    # Read configuration from the environment; never hard-code secrets.
    server = os.environ["SQL_SERVER"]      # for example, myserver.database.windows.net
    database = os.environ["SQL_DATABASE"]  # for example, AdventureWorks
    client_id = os.getenv("AZURE_CLIENT_ID")  # set for a user-assigned managed identity

    # Authenticate with the workload's managed identity over TDS 8.0 encryption.
    # ConnectRetryCount/ConnectRetryInterval transparently reconnect a dropped
    # idle connection; they don't replay a failed query.
    conn_str = (
        f"Server={server};"
        f"Database={database};"
        "Authentication=ActiveDirectoryMsi;"
        "Encrypt=strict;"
        "ConnectRetryCount=3;"
        "ConnectRetryInterval=10;"
    )
    if client_id:
        conn_str += f"UID={client_id};"

    query = """
        SELECT TOP 10
            p.BusinessEntityID,
            p.FirstName,
            p.LastName
        FROM Person.Person AS p
        ORDER BY p.BusinessEntityID;
    """

    try:
        # Context managers close the cursor and connection automatically.
        with connect_with_retry(conn_str) as conn:
            with execute_with_retry(conn, query) as cursor:
                for business_entity_id, first_name, last_name in cursor.fetchall():
                    print(f"{business_entity_id}\t{first_name}\t{last_name}")
    except mssql_python.Error:
        logger.exception("query failed")
        raise


if __name__ == "__main__":
    main()

Para orientações mais detalhadas sobre cada preocupação neste exemplo, veja Autenticação Microsoft Entra, Pool de conexões, Criptografia e certificados, Lógica de tentativas e Tratamento de erros.

Características principais

  • Conformidade com a PEP 249: Interfaces padrão connect, cursor, execute e fetch*, além de extensões idiomáticas do Python.
  • Conectividade Direta de Banco de Dados (DDBC): Não é necessário gerenciador externo de drivers. Instale mssql-python e você estará pronto para conectar.
  • Autenticação Microsoft Entra ID: Suporte embutido para modos de autenticação, incluindo identidades gerenciadas e princípios de serviço.
  • Autenticação do SQL Server e do Windows: logins do SQL Server, Kerberos e logon único do Windows (SSO) em plataformas compatíveis.
  • Cópia em massa: Inserção em massa de alto desempenho para grandes cargas de dados com suporte nativo ao protocolo TDS.
  • Suporte nativo a tipos de dados: JSON, XML, espacial, colunas esparsas, datetimeoffset e decimal/money com tratamento preciso.
  • Integração com Apache Arrow: Conjuntos de resultados sem cópias para troca rápida de dados com pandas, Polars e DuckDB.
  • Padrões assíncronos: Use o driver em aplicativos baseados em asyncio e com FastAPI, com soluções alternativas usando o ThreadPoolExecutor. Veja padrões assíncronos para padrões de integração.
  • TLS por padrão: criptografia TLS e validação de certificados ativada por padrão (via ODBC Driver 18). A criptografia TDS 8.0 está disponível quando você define Encrypt=strict.

Introdução

Artigo Descrição
Instalação Instale mssql-python e verifique seu ambiente Python.
Início rápido: Conecte-se com mssql-python Conecte-se a uma instância local ou teste do SQL Server e execute sua primeira consulta.
Início Rápido: Conecte-se a partir de um Jupyter Notebook Use mssql-python dentro de um caderno para exploração interativa de dados.
Início rápido: Cópia em massa Mova grandes conjuntos de dados para o SQL Server com a API de cópia em massa.
Início Rápido: Prototipagem rápida Construa scripts pequenos e provas de conceito rapidamente.
Início Rápido: Implantações repetíveis Empacote, configure e envie aplicações Python que se comunicam com SQL.
Início rápido do Apache Arrow Buscar resultados de consulta como tabelas Apache Arrow para fluxos de trabalho analíticos.

Configurar e autenticar

Artigo Descrição
Strings de conexão Sintaxe de string de conexão, palavras-chave comuns e exemplos.
Construir cadeias de conexão programáticamente Monte strings de conexão com segurança com base em configurações e segredos.
Gerenciamento de conexões Abra, reutilize e feche as conexões de forma limpa.
Agrupamento de conexões Ajuste de pool, tempos de vida e padrões de reutilização.
Criptografia e certificados Modos de criptografia TLS, validação de certificados e TDS 8.0.
Autenticação do Microsoft Entra Autenticação sem senha para o SQL do Azure com identidade gerenciada, entidade de serviço, fluxos interativos e fluxos de código do dispositivo.
Melhores práticas de segurança Parametrização, gerenciamento de segredos, privilégio mínimo e criptografia.
Grupos de disponibilidade Conecte-se aos grupos de disponibilidade Always On e às réplicas somente de leitura.

Trabalhar com dados

Artigo Descrição
Execução de consultas execute, executemany, lotes com múltiplas instruções e conjuntos de resultados.
Recuperação de dados fetchone, fetchmany, fetchall, e padrões de streaming.
Consultas parametrizadas Vincule parâmetros com segurança para evitar a injeção de SQL.
Procedimentos armazenados Chame procedimentos, leia os parâmetros de saída e processe conjuntos de resultados.
Gerenciamento do cursor Tempos de vida do cursor, rolagem e ajuste do arraysize.
Objetos de linha Acesse as linhas por índice, nome ou como mapeamentos.
Gerenciamento de transações Confirmação, reversão, pontos de salvamento e níveis de isolamento.
Paginação Padrões de paginação por keyset e por deslocamento em grandes conjuntos de resultados.
Tratamento de erros mssql_python.Error, DatabaseError, e estrutura de erro do SQL Server.
Lógica de repetição Detecte erros transitórios e tente novamente com retardo exponencial.

Tipos e recursos de dados do SQL Server

Artigo Descrição
Mapeamentos de tipo de dados Tabelas e regras de conversão do tipo SQL Server para Python.
Manipulação de datas datetime, datetime2, datetimeoffset, e considerações de fuso horário.
Tipos decimais e moeda Tipos numéricos exatos e precisão decimal.Decimal.
Cadeia de caracteres e dados Unicode varchar, nvarchar, colações e páginas de código.
Tratamento de NULL Lógica de três valores, sentinelas e pandas interoperam.
Dados binários varbinary, image e transmissão de objetos grandes.
Conversores de tipo personalizado Registrem conversores de entrada e saída para tipos personalizados.
Operações de cópia em massa Inserções de alta vazão com a API de cópia em lote.
Dados JSON Armazene, consulte e fragmente JSON com FOR JSON e OPENJSON.
Dados XML Trabalhe com o xml tipo de dado, XPath e XQuery.
Dados espaciais geometry e os tipos geography do Python.
Colunas esparsas Colunas esparsas e conjuntos de colunas para tabelas amplas.
Descoberta de esquema Inspecione bancos de dados, tabelas, colunas e índices.

Integre com ferramentas e frameworks do Python

Artigo Descrição
Integração com Apache Arrow Busque resultados como tabelas Arrow para análises sem cópia.
integração do Pandas Carregue os resultados das consultas em DataFrames e grave-os novamente.
Integração com Polars Use Polars com mssql-python para cargas de trabalho em colunas.
Integração com DuckDB Consulte dados do SQL Server junto com tabelas locais do DuckDB.
Integração com FastAPI Conecte mssql-python aos serviços FastAPI.
Integração com Flask Use mssql-python em aplicações Flask.
Padrões assíncronos Combine o mssql-python com asyncio e conjuntos de threads.
Padrões de acesso a dados e análises Escolha o caminho de leitura correto para acesso ao cursor, extração de setas, pandas, polares e análises do DuckDB sobre dados SQL.
Padrões de carregamento e movimento de dados Escolha o caminho de escrita correto para inserções de linhas, cópia em massa, MERGE upserts, carregamento de DataFrame e ingesta de CSV.

Implantar e operar

Artigo Descrição
Contêiner e desenvolvimento local Configure contêineres Docker, devcontainers e pipelines de CI para aplicações Python que se conectam ao SQL.
Otimização do desempenho Ajuste de pool, declarações preparadas, tamanhos de lote e cópia em massa.
Solução de problemas Erros comuns, registros e diagnósticos de certificados.
Configuração do módulo Configurações em nível de módulo, ganchos de registro e sinalizadores de recurso.

Migrar para mssql-python

Artigo Descrição
Migrar do pyodbc Mapeie as APIs do pyodbc e as strings de conexão para o mssql-python.
Migrar de pymssql Substitua pymssql por mssql-python preservando o comportamento.
Migrar a partir do SQLite Mova cargas de trabalho locais do SQLite para o SQL Server ou SQL do Azure.
Migrar do PostgreSQL Guia único para desenvolvedores Python que migram do PostgreSQL para o SQL Server com mssql-python.

Demonstrativo

Artigo Descrição
Ciclo de vida do suporte Versões compatíveis do Python e do SQL Server e cadência de atualizações.
Novidades Histórico de versões e destaques da versão.