Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Cada versão do driver mssql-python introduz novas funcionalidades, melhorias de desempenho e correções de bugs. As secções seguintes detalham todas as versões.
mssql-python 1.12.0
Data de lançamento: julho de 2026
Enhancements
Pacote complementar independente mssql-python-odbc
Os binários do controlador ODBC de que mssql-python necessita em tempo de execução são agora também publicados como um pacote complementar separado, apenas de dados: mssql-python-odbc (nome de importação mssql_python_odbc, atualmente fixado na versão 18.6.2). O mssql-python pacote declara mssql-python-odbc==18.6.2 em install_requires, por isso pip install mssql-python instala transparentemente o pacote complementar ao seu lado. Não são necessárias alterações de código.
O carregador nativo prefere o pacote externo mssql_python_odbc quando este está presente e, caso contrário, recorre aos binários ODBC ainda incluídos no wheel mssql-python. O plano B é seguro com o Python Global Interpreter Lock (GIL) e funciona em distribuições Linux baseadas em musl, como o Alpine.
Esta divisão permite fixar ou atualizar os binários dos drivers independentemente do código Python, dá aos redistribuidores uma roda mais pequena mssql-python ao longo do tempo e evita problemas de propriedade duplicada provenientes de ficheiros ODBC agrupados.
Importante
Isto dividia os navios sem qualquer alteração. Numa futura versão principal (v2.0.0), a árvore incluída libs/ poderá ser removida; nesse caso, mssql-python-odbc torna-se um requisito obrigatório em tempo de execução.
Correções de erros
cursor.bulkcopy() passa a usar o tempo limite de ligação da conexão principal
A operação de cópia em massa abre uma conexão separada através da extensão nativa mssql_py_core. Anteriormente, esta operação usava sempre um tempo limite de ligação de 15 segundos definido de forma fixa no código, sem possibilidade de o substituir a partir de Python. Se definir um tempo limite de ligação na ligação principal (connect(..., timeout=<seconds>)), bulkcopy() agora encaminha esse valor para a ligação interna. A definição timeout=0 preserva o comportamento de não substituição e mantém o valor predefinido interno de 15 segundos. O timeout do cursor no momento da bulkcopy() chamada é usado para a operação, por isso alterações posteriores à ligação principal não afetam uma cópia em massa em voo.
O exemplo seguinte utiliza a tabela de consulta Production.Culture da base de dados de exemplo AdventureWorks. Ajuste a cadeia de ligação e o nome da base de dados para o seu ambiente:
import mssql_python
from datetime import datetime
# The 60-second timeout applies to both the initial connection and
# the internal connection that bulkcopy() opens.
conn = mssql_python.connect(
"Server=<server>;"
"Database=AdventureWorks2022;"
"Encrypt=yes",
timeout=60,
)
conn.autocommit = True
cursor = conn.cursor()
# Bulk-copy two rows into Production.Culture (CultureID, Name, ModifiedDate).
now = datetime.now()
rows = [
("xx", "Demo culture 1", now),
("yy", "Demo culture 2", now),
]
result = cursor.bulkcopy("Production.Culture", rows)
print(f"Copied {result['rows_copied']} rows")
# Remove the demo rows so the sample is re-runnable.
cursor.execute("DELETE FROM Production.Culture WHERE CultureID IN ('xx','yy')")
cursor.bulkcopy() suporta colunas de tipos CLR definidas pelo utilizador
Anteriormente, cursor.bulkcopy() falhava com Protocol Error: Unsupported TDS type for bulk copy: 0xF0 para qualquer coluna de destino que utilizasse um tipo definido pelo utilizador (UDT) do Common Language Runtime (CLR), incluindo os tipos incorporados geography, geometry e hierarchyid, bem como qualquer UDT CLR personalizado registado num assembly. O canal nativo mssql_py_core não tinha nenhum processador para o token de tipo UDT (0xF0) e gerou um erro ao escrever os metadados das colunas, antes de serem enviadas quaisquer linhas. As colunas UDT CLR são agora mapeadas para varbinary(max) na ligação, e os bytes fornecidos são enviados em fluxo como payload do UDT IBinarySerialize, em conformidade com a forma como pyodbc e python-tds carregam colunas UDT. O SQL Server materializa o UDT ao inserir. Disponibilizado através da mssql_py_core atualização de 0.1.6 para 0.1.7.
O exemplo seguinte arquiva a coluna de organograma de HumanResources.Employee (uma coluna hierarchyid, um dos UDTs CLR incorporados do SQL Server) numa nova tabela. Num fluxo de trabalho real, os bytes UDT podem vir de outra instância do SQL Server, de um ficheiro serializado ou da saída de IBinarySerialize.Write() do seu tipo CLR; este exemplo lê-os de uma coluna existente através de CAST(... AS varbinary(max)), para que o exemplo seja autónomo. A cópia em massa inclui a linha em que OrganizationNode é NULL:
import mssql_python
conn = mssql_python.connect(
"Server=<server>;"
"Database=AdventureWorks2022;"
"Encrypt=yes",
)
conn.autocommit = True # bulkcopy uses a separate connection; the destination must be visible
cursor = conn.cursor()
cursor.execute(
"IF OBJECT_ID('dbo.EmployeeOrgArchive','U') IS NOT NULL "
"DROP TABLE dbo.EmployeeOrgArchive;"
"CREATE TABLE dbo.EmployeeOrgArchive (BusinessEntityID int, OrganizationNode hierarchyid);"
)
# Casting a hierarchyid column to varbinary(max) yields the UDT's
# serialized IBinarySerialize payload.
cursor.execute(
"SELECT BusinessEntityID, CAST(OrganizationNode AS varbinary(max)) "
"FROM HumanResources.Employee;"
)
rows = cursor.fetchall()
# Stream the (id, bytes) tuples into the destination's hierarchyid column.
result = cursor.bulkcopy("dbo.EmployeeOrgArchive", rows)
print(f"Copied {result['rows_copied']} rows")
cursor.execute("DROP TABLE dbo.EmployeeOrgArchive")
Para um CLR UDT personalizado, registado num assembly, use o tipo na tabela de destino e forneça os bytes produzidos pelo método IBinarySerialize.Write() do tipo.
mssql-python 1.11.0
Data de lançamento: julho de 2026
Enhancements
Semântica melhorada do gestor de contexto
with connection: agora confirma corretamente as transações ao terminar sem erros e anula-as em caso de exceção, tornando-o mais idiomático em Python e previsível.
import mssql_python
# On clean exit, transaction commits
with mssql_python.connect(connection_string) as conn:
cursor = conn.cursor()
cursor.execute("INSERT INTO MyTable (Name) VALUES ('Alice')")
# Automatically committed on exit
# On exception, transaction rolls back
try:
with mssql_python.connect(connection_string) as conn:
cursor = conn.cursor()
cursor.execute("INSERT INTO MyTable (Name) VALUES ('Bob')")
raise ValueError("Oops!")
except ValueError:
pass
# Changes rolled back on exit
Correções de erros
- Corrigido um interbloqueio do GIL no processo de encerramento do ODBC (
conn.close()ecursor.close()) e emSQLDescribeParampara parâmetros com valorNoneem configurações com túnel SSH e com encaminhador no processo. - Parâmetros fixos
BINARYeVARBINARYNULL em tabelas temporárias e variáveis de tabela. Quando a resolução automática de tipos falha, o driver emite agora um aviso Python com orientação explícitacursor.setinputsizes(). - Corrigida a falha de
import mssql_pythonem Apple Silicon numa instalação limpa (regressão introduzida na versão 1.8.0). As dependências ODBC dylib incluídas foram agora reescritas para as arquiteturasarm64ex86_64. - Corrigido um deadlock GIL no núcleo Rust que congelava as operações de cópia em massa ao autenticar com
Authentication=ActiveDirectoryServicePrincipal.
mssql-python 1.10.0
Data de lançamento: junho de 2026
Enhancements
Suporte ActiveDirectoryServicePrincipal para cópia em massa
cursor.bulkcopy() suporta agora Authentication=ActiveDirectoryServicePrincipal, permitindo inserções em lote utilizando credenciais do principal de serviço.
import mssql_python
conn = mssql_python.connect(
"Server=<server>.database.windows.net;"
"Database=<database>;"
"Authentication=ActiveDirectoryServicePrincipal;"
"UID=<application-client-id>;"
"PWD=<client-secret>;"
"Encrypt=yes"
)
cursor = conn.cursor()
cursor.execute("CREATE TABLE ##SpDemo (ID INT, Value FLOAT)")
conn.commit()
result = cursor.bulkcopy("##SpDemo", [(1, 1.5), (2, 2.5)])
print(f"Copied {result['rows_copied']} rows")
Correções de erros
- Corrigidos os dados não ASCII
VARCHAReCHARno caminho de obtenção do Arrow. - Corrigidos os tempos limite de ligação durante operações de carregamento em massa.
MSSQL-Python 1.9.0
Data de lançamento: junho de 2026
Enhancements
Objetos de linha na cópia em massa
cursor.bulkcopy() passa agora a aceitar diretamente objetos obtidos Row em vez de exigir a conversão manual de tuplos.
import mssql_python
conn = mssql_python.connect(connection_string)
cursor = conn.cursor()
# Fetch rows from source table
cursor.execute("SELECT ProductID, Name, ListPrice FROM Production.Product")
rows = cursor.fetchall()
# Pass fetched Row objects directly to bulkcopy
cursor.execute("CREATE TABLE ##RowBulkDemo (ProductID INT, Name NVARCHAR(50), ListPrice MONEY)")
conn.commit()
result = cursor.bulkcopy("##RowBulkDemo", rows)
print(f"Copied {result['rows_copied']} rows")
Correções de erros
- Embalagem de rodas fixas, por isso
simdutfestá sempre ligada estaticamente. - Fixei inserções grandes
DECIMALemexecutemany(). - Corrigida a alternativa incorreta do tipo para parâmetros NULL.
- Corrigida a exceção nas operações de pickle e unpickle.
- Foi corrigido
nextset()para que preservasse as mensagensPRINTentre diferentes conjuntos de resultados. - Manipulação corrigida
Rownoexecutemany()caminho de queda de dados na execução. - Corrigida a verificação de tipos do método fetch para ferramentas de análise estática.
mssql-python 1.8.0
Data de lançamento: maio de 2026
Enhancements
Suporte ActiveDirectoryMSI para cópia em massa
cursor.bulkcopy() suporta agora Authentication=ActiveDirectoryMSI para identidades geridas atribuídas pelo sistema e atribuídas pelo utilizador.
import mssql_python
# System-assigned managed identity
conn = mssql_python.connect(
"Server=<server>.database.windows.net;"
"Database=<database>;"
"Authentication=ActiveDirectoryMSI;"
"Encrypt=yes"
)
cursor = conn.cursor()
cursor.execute("CREATE TABLE ##MsiDemo (ID INT, Name NVARCHAR(50))")
conn.commit()
result = cursor.bulkcopy("##MsiDemo", [(1, "Alice"), (2, "Bob")])
print(f"Copied {result['rows_copied']} rows")
Indexação de linha por chave de tipo string
Agora pode aceder aos valores das linhas pelo nome da coluna, por exemplo row["col"], além da indexação posicional e do acesso a atributos.
import mssql_python
conn = mssql_python.connect(connection_string)
cursor = conn.cursor()
cursor.execute("SELECT ProductID, Name, ListPrice FROM Production.Product WHERE ProductID = 1")
row = cursor.fetchone()
# Access by column name (new in 1.8.0)
print(row["ProductID"]) # Access by key
print(row["Name"])
# Still supports positional indexing
print(row[0]) # Positional access
# And attribute access
print(row.Name) # Attribute access
Atualização do driver ODBC integrado
O driver Microsoft ODBC para SQL Server incluído foi atualizado para a versão 18.6.2.1.
Correções de erros
- Foram corrigidos problemas de tempo de vida diferido do atributo connect na autenticação baseada em tokens.
- Corrigi a análise repetida de cadeia de ligação no caminho de autenticação.
- Anotações de tipo fixo
executemany()para entradas de sequência.
mssql-python 1.7.1
Data de lançamento: maio de 2026
Enhancements
Cobertura expandida das rodas e melhorias de desempenho
Esta versão adiciona wheels compatíveis com o RHEL 8, restaura as wheels do macOS para Python 3.10 universal2, melhora o tratamento de UTF-16 através de simdutf e otimiza o caminho crítico de execute().
Impacto no desempenho: A taxa de transferência da execução em lote melhora em ~15% em cargas de trabalho típicas devido a otimizações no caminho crítico do método execute().
Correções de erros
- Foram corrigidas falhas de início de sessão para que gerem exceções da DB-API
mssql_pythonem vez deRuntimeError. - Libertação estendida de GIL através do bloqueio de execução, busca, transação e chamadas de atributos de ligação ODBC.
- Falhas corrigidas
executemany()quando os valores decimais mudam de sinal. - Corrigi a decodificação inconsistente do CP1252
VARCHARentre plataformas. - Corrigidas as falhas de
cursor.bulkcopy()para strings vazias nas colunasNVARCHAR(MAX)eVARCHAR(MAX).
Note
A versão 1.7.0 foi retirada devido a problemas de publicação. Use a versão 1.7.1 ou posterior.
MSSQL-Python 1.6.0
Data de lançamento: abril de 2026
Enhancements
Sanitização de cadeia de ligação baseada em analisador
Esta melhoria garante o processamento correto de caracteres especiais nos campos de palavra-passe e nos valores entre chavetas.
import mssql_python
# Complex passwords with special characters now parse correctly
conn = mssql_python.connect(
"Server=<server>.database.windows.net;"
"Database=<database>;"
"UID=user@contoso;"
"PWD={p@ssw0rd;with{braces}};" # Braced values now handled correctly
"Encrypt=yes"
)
A sanitização da cadeia de ligação passou de uma lógica baseada em expressões regulares para um processamento baseado em analisador sintático, para garantir o tratamento correto da sintaxe das cadeias de ligação ODBC.
Correções de erros
- Corrigi a libertação do GIL durante o bloqueio das operações de ligação e desconexão ODBC.
- Corrigi
setinputsizes()crashes comSQL_DECIMALeSQL_NUMERICdicas. - Corrigido o comportamento incorreto de
fetchone()nos métodos de catálogo ODBC. - Corrigidos erros de estado inválido do cursor quando
reset_cursor=Falseé usado. - Dicas de tipo fixo
executemany()para sequências de parâmetros baseadas em mapeamento. - Foi adicionado um guarda de percurso de caminho para
setup_logging(log_file_path=...).
MSSQL-Python 1.5.0
Data de lançamento: abril de 2026
Novas funcionalidades
Suporte de busca do Apache Arrow
Três novos métodos de cursor proporcionam recuperação de dados colunares de alto desempenho através da Interface de Dados Arrow C:
-
cursor.arrow()retorna umpyarrow.Tablecompleto. -
cursor.arrow_batch()devolve um únicopyarrow.RecordBatch. -
cursor.arrow_reader()devolve umpyarrow.RecordBatchReaderpara transmissão em fluxo.
A implementação ignora a criação de objetos em Python no caminho quente para melhorar o desempenho. Para documentação completa, veja integração com o Apache Arrow.
suporte para o tipo sql_variant
O driver agora deteta sql_variant colunas em tempo de busca, resolve o seu tipo base subjacente e devolve valores Python corretamente digitados em vez de bytes brutos.
Note
sql_variant As colunas usam um caminho de busca em streaming, que pode ter um ligeiro impacto no desempenho em comparação com colunas do tipo fixo.
Suporte nativo à UUID
Uma nova definição native_uuid controla se as colunas UNIQUEIDENTIFIER são devolvidas como objetos uuid.UUID (por defeito) ou como cadeias de caracteres em maiúsculas compatíveis com pyodbc. Configure-o ao nível do módulo ou por ligação:
# Module-level default
settings = mssql_python.get_settings()
settings.native_uuid = True # default
# Per-connection override
conn = mssql_python.connect(connection_string, native_uuid=False)
Para mais informações, consulte Configuração do módulo.
Classe de linha de exportação pública
A Row classe é agora exportada ao nível superior para anotações de tipo:
from mssql_python import Row
Correções de erros
- Corrigiu a deteção de falsos positivos
?dentro de identificadores colcheados, literais de string e comentários. - Corrigida a associação de parâmetros NULL em colunas
VARBINARY(já não gera erros de conversão implícita). - Corrigido um problema em que valores
datetime.timede ponto fixo perdiam os microssegundos em operações de ida e volta para colunas deTIME(1)aTIME(7). - Corrigido o caminho de obtenção do Arrow para incluir corretamente segundos fracionais nas colunas
TIME. - Cópia em massa corrigida com métodos de autenticação do Microsoft Entra ID (campos de credenciais obsoletos já não causam erros de validação).
- Instâncias de credenciais Azure Identity armazenadas em cache ao nível do módulo para melhorar o desempenho da autenticação.
mssql-python 1.4.0
Data de lançamento: março de 2025
Novas funcionalidades
Suporte para cópia em massa
O carregamento de dados em massa de alto desempenho está agora disponível através de:cursor.bulkcopy()
import mssql_python
conn = mssql_python.connect(connection_string)
cursor = conn.cursor()
cursor.execute("CREATE TABLE ##BulkDemo (ID INT, Name NVARCHAR(50), Price DECIMAL(10,2))")
conn.commit()
data = [
(1, "Item 1", 10.50),
(2, "Item 2", 20.75),
# ... potentially millions of rows
]
result = cursor.bulkcopy("##BulkDemo", data)
print(f"Copied {result['rows_copied']} rows")
O método aceita opções para batch_size, timeout, column_mappings, keep_identity, check_constraints, table_lock, keep_nulls, fire_triggers, e use_internal_transaction.
Consulte Cópia em lote para obter a documentação completa.
Improvements
- Otimizações de desempenho para grandes conjuntos de resultados.
- Redução do uso de memória durante operações em lote.
- Mensagens de erro melhoradas para falhas de cópia em massa.
mssql-python 1.3.0
Data de lançamento: janeiro de 2025
Novas funcionalidades
Classe de definições
Configure o comportamento em todo o módulo através da nova Settings classe:
import mssql_python
settings = mssql_python.get_settings()
settings.lowercase = True # Lowercase column names in cursor.description
Consulte a configuração do módulo para mais detalhes.
Improvements
- Melhor gestão do timeout da ligação durante o failover do SQL do Azure.
- Compatibilidade melhorada com Python 3.13.
mssql-python 1.2.0
Data de lançamento: novembro de 2024
Novas funcionalidades
Métodos de descoberta de esquemas
Novos métodos de cursor para exploração de metadados de bases de dados:
cursor = conn.cursor()
# List all tables
cursor.tables(schema="dbo")
# Get column information
cursor.columns(table="Product", schema="Production")
# Get primary keys
cursor.primaryKeys(table="Product", schema="Production")
# Get foreign key relationships
cursor.foreignKeys(table="SalesOrderDetail", schema="Sales")
# Get stored procedures
cursor.procedures(schema="dbo")
# Get index statistics
cursor.statistics(table="Product", schema="Production")
# Get type information
cursor.getTypeInfo()
Consulte Descoberta de esquemas para documentação completa.
Improvements
- Cache de metadados melhorado para consultas repetidas de esquema.
- Melhor gestão das colunas computadas nos
columns()resultados.
mssql-python 1.1.0
Data de lançamento: setembro de 2024
Novas funcionalidades
Conversores de saída personalizados
Registar funções personalizadas para transformar os valores das colunas durante a obtenção:
import mssql_python
from decimal import Decimal
conn = mssql_python.connect(connection_string)
# Convert decimals to float (converter receives Decimal)
def decimal_to_float(value):
if value is None:
return None
return float(value) # value is already a Decimal object
conn.add_output_converter(mssql_python.SQL_DECIMAL, decimal_to_float)
# Custom money formatting
def format_money(value):
if value is None:
return "$0.00"
return f"${float(value):,.2f}" # value is already a Decimal object
conn.add_output_converter(mssql_python.SQL_DECIMAL, format_money)
Métodos de gestão:
add_output_converter(sql_type, converter_func)get_output_converter(sql_type)remove_output_converter(sql_type)clear_output_converters()
Para documentação completa, veja Conversores de tipo personalizado.
Improvements
- Mensagens de erro melhores para falhas de conversão de tipos.
- Suporte para funções de conversor que retornam
None.
mssql-python 1.0.0
Data de lançamento: julho de 2024
Lançamento inicial da disponibilidade geral
A primeira versão de disponibilidade geral do mssql-python, o driver nativo de Python da Microsoft para SQL Server.
Principais características
- Arquitetura DDBC: Conectividade direta com base de dados sem necessidade de instalação de drivers ODBC.
- Conformidade com a DB-API 2.0: Interface padrão de base de dados para Python.
- Agrupamento de ligações: Gestão incorporada do agrupamento de ligações.
- Autenticação Microsoft Entra: Suporte total para autenticação baseada em identidade no Azure.
- Encriptação TLS: Ligações seguras com validação de certificados.
Características de ligação
- 21 palavras-chave da cadeia de ligação.
- 9 modos de autenticação (SQL, Windows e 7 métodos Microsoft Entra ID).
- Controlo de autocommit.
- Métodos de execução:
execute(),executemany(), ebatch_execute(). - Atributos de ligação através de
set_attr()egetinfo(). - Suporte ao gestor de contexto.
Características do cursor
- Métodos padrão de busca:
fetchone(),fetchmany(),fetchall(). - Métodos estendidos:
fetchval(),skip(). - Métodos de execução:
execute()eexecutemany(). - Objetos de linha com acesso a atributos e índice.
- Navegação por múltiplos conjuntos de resultados com
nextset().
Suporte a tipos de dados
- Todos os tipos nativos do SQL Server.
- Mapeamento de tipos Python↔SQL.
- Constantes de tipo SQL para tipagem explícita (por exemplo,
mssql_python.SQL_DECIMAL). - Tratamento de NULL em Python
None.
Suporte a transações
- Confirmação e reversão manuais.
- Modo de confirmação automática.
- Controlo do nível de isolamento.
- Deteção e manuseamento de bloqueios.
Modos de autenticação
| Mode | Descrição |
|---|---|
| Autenticação do SQL Server | Nome de utilizador e palavra-passe |
| Windows authentication | Trusted_Connection |
| ActiveDirectoryDefault | DefaultAzureCredential |
| ActiveDirectoryInteractive | Início de sessão baseado em navegador |
| ActiveDirectoryDeviceCode | Fluxo de código do dispositivo |
| ActiveDirectoryPassword | Nome de utilizador e palavra-passe do Microsoft Entra (descontinuado; usa ROPC) |
| ActiveDirectoryMSI | Identidade gerenciada |
| ActiveDirectoryServicePrincipal | Serviço principal |
| Integrado no Active Directory | Windows Kerberos |
Upgrade
De pyodbc
Para orientações detalhadas sobre migração, veja Migrar a partir de pyodbc.
Principais diferenças:
- São suportados os estilos de parâmetros
?(qmark) e%(name)s(pyformat). As suas consultas existentes?funcionam sem alterações. - Nenhum método
callproc(). Utilize instruçõesEXECUTEem vez disso. - Agrupamento de ligações integrado.
- Sem dependência de drivers ODBC externos.
De pymssql
Para orientações detalhadas sobre migração, veja Migrar a partir do pymssql.
Principais diferenças:
- Substitua os marcadores de parâmetros
%se%dpor?ou%(name)s. - Use uma cadeia de ligação em vez de argumentos posicionais.
- Sem dependência do FreeTDS.
- Vários cursores concorrentes por ligação.
- Os objetos de linha com acesso a atributos substituem
as_dict=True.
Entre versões mssql-python
Atualize o driver para obter novas funcionalidades e correções.
pip install --upgrade mssql-python
Verifique as notas de lançamento para ver se há alterações repentinas antes de atualizar os sistemas de produção.
Roteiro
Para funcionalidades futuras e o roteiro de desenvolvimento, consulte o repositório GitHub.