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
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. |
Implantar e operar
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. |
Conteúdo relacionado