Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Varje version av mssql-python-drivrutinen introducerar nya funktioner, prestandaförbättringar och buggfixar. Följande avsnitt beskriver varje version.
mssql-python 1.12.0
Releasedatum: juli 2026
Enhancements
Fristående mssql-python-odbc följeslagarpaket
ODBC-drivrutinsbinärerna som mssql-python behöver vid körning publiceras nu också som ett separat, kompletterande paket med endast data: mssql-python-odbc (importnamn mssql_python_odbc, för närvarande låst till version 18.6.2). Paketet mssql-python deklarerar mssql-python-odbc==18.6.2 i install_requires, så pip install mssql-python installerar automatiskt det tillhörande paketet tillsammans med det. Inga kodändringar krävs.
Den inbyggda laddaren föredrar det externa mssql_python_odbc-paketet när det finns, och använder i stället ODBC-binärfilerna som fortfarande medföljer i mssql-python-wheelen när det inte gör det. Reservkoden är säker med Python Global Interpreter Lock (GIL) och fungerar på musl-baserade Linux-distributioner som Alpine.
Denna uppdelning låter dig fästa eller uppdatera drivrutinsbinärerna oberoende av Python-koden, ger redistributörer ett mindre mssql-python hjul över tid och undviker problem med duplicerad ägande från paketerade ODBC-filer.
Important
Denna split levereras utan någon brytande förändring. I en framtida huvudversion (v2.0.0) kan det medföljande libs/-trädet tas bort, i vilket fall mssql-python-odbc blir ett obligatoriskt körtidskrav.
Felkorrigeringar
cursor.bulkcopy() använder nu föräldraanslutningens anslutningstimeout
Masskopieringen öppnar en separat anslutning via det mssql_py_core inbyggda tillägget. Tidigare använde denna operation alltid en hårdkodad 15-sekunders anslutningstidsavbrott utan möjlighet att åsidosätta den från Python. Om du sätter en anslutningstimeout på föräldraanslutningen (connect(..., timeout=<seconds>)), bulkcopy() vidarebefordrar nu det värdet till den interna anslutningen. Inställningen timeout=0 bibehåller beteendet ingen åsidosättning och behåller det interna standardvärdet på 15 sekunder. Markörens timeout vid tidpunkten för anropet bulkcopy() används för operationen, så senare ändringar i den överordnade anslutningen påverkar inte en pågående bulkkopiering.
Följande exempel använder Production.Culture uppslagstabellen från AdventureWorks exempeldatabas. Justera reťazec pripojenia och databasnamn för din miljö:
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() stöder CLR-användardefinierade typkolumner
Tidigare misslyckades cursor.bulkcopy() med Protocol Error: Unsupported TDS type for bulk copy: 0xF0 för alla destinationskolumner som använde en användardefinierad typ i Common Language Runtime (CLR), inklusive de inbyggda typerna geography, geometry och hierarchyid samt alla anpassade CLR UDT:er som registrerats i en sammansättning. Den inbyggda mssql_py_core trådvägen hade ingen hanterare för UDT-typtoken (0xF0) och gjorde fel när kolumnmetadata skrevs, innan några rader skickades. CLR UDT-kolumner mappas nu till varbinary(max) på tråden, och de medföljande bytena strömmas som UDT:ns IBinarySerialize nyttolast, vilket matchar hur pyodbc och python-tds laddar UDT-kolumner. SQL Server materialiserar UDT vid insättning. Levereras via mssql_py_core uppdateringen från 0.1.6 till 0.1.7.
Följande exempel arkiverar orgchartkolumnen från HumanResources.Employee (en hierarchyid-kolumn, en av SQL Server:s inbyggda CLR UDT:er) till en ny tabell. I ett verkligt arbetsflöde kan UDT-bytena komma från en annan SQL Server-instans, en serialiserad fil eller utdata från din CLR-typ IBinarySerialize.Write(); det här exemplet läser dem från en befintlig kolumn via CAST(... AS varbinary(max)), så att exemplet är fristående. Masskopieringen inkluderar raden där OrganizationNode är 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")
För en anpassad, sammansättningsregistrerad CLR UDT använder du typen i måltabellen och anger de byte som genereras av typens metod IBinarySerialize.Write().
mssql-python 1.11.0
Releasedatum: juli 2026
Enhancements
Förbättrad semantik för kontexthanterare
with connection: bekräftar nu korrekt transaktioner vid korrekt avslut och rullar tillbaka dem vid undantag, vilket gör det mer Pythoniskt och förutsägbart.
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
Felkorrigeringar
- Åtgärdade en GIL-deadlock i ODBC:s avvecklingsväg (
conn.close()ochcursor.close()) och iSQLDescribeParamför parametrar med värdetNonei konfigurationer med SSH-tunnel och vidarebefordrare i processen. - Fasta
BINARYochVARBINARYNULL-parametrar i temporära tabeller och tabellvariabler. När automatisk typupplösning misslyckas genererar drivrutinen nu en varning i Python med tydligcursor.setinputsizes()vägledning. - Fixade
import mssql_pythonfel på Apple Silicon med en ren installation (regression i 1.8.0). De medföljande ODBC-dylib-beroendena har nu skrivits om för bådearm64- ochx86_64-arkitekturer. - Åtgärdade en GIL-deadlock i Rust-kärnan som gjorde att bulkkopieringsåtgärder låste sig vid autentisering med
Authentication=ActiveDirectoryServicePrincipal.
mssql-python 1.10.0
Utgivningsdatum: juni 2026
Enhancements
ActiveDirectoryServicePrincipal-stöd för masskopiering
cursor.bulkcopy() stöder nu Authentication=ActiveDirectoryServicePrincipal, vilket möjliggör massinfogningar med autentiseringsuppgifter för tjänstens huvudnamn.
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")
Felkorrigeringar
- Åtgärdade data som inte är i ASCII-format för
VARCHARochCHARi Arrow-hämtningssökvägen. - Fasta anslutningstidsavbrott under bulklast.
mssql-python 1.9.0
Utgivningsdatum: juni 2026
Enhancements
Radobjekt i bulk-kopiering
cursor.bulkcopy() accepterar nu hämtade Row objekt direkt istället för att kräva manuell tuplekonvertering.
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")
Felkorrigeringar
- Fast hjulpaketering så
simdutfdet är alltid statiskt kopplat. - Åtgärdade stora
DECIMALinfogningar iexecutemany(). - Fixade felaktig typ av fallback för NULL-parametrar.
- Fixade undantag för pickle och av-pickle tur-och-retur.
- Åtgärdat
nextset()så att det behållerPRINTmeddelanden mellan resultatuppsättningar. - Åtgärdade hanteringen av
Rowi reservvägen för data-at-execution iexecutemany(). - Åtgärdade typkontrollen för fetch-metoden för statiska analysverktyg.
mssql-python 1.8.0
Utgivningsdatum: maj 2026
Enhancements
ActiveDirectoryMSI-stöd för masskopiering
cursor.bulkcopy() stöder Authentication=ActiveDirectoryMSI nu systemtilldelade och användartilldelade hanterade identiteter.
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")
Indexering med strängnyckel för rad
Du kan nu komma åt radvärden efter kolumnnamn, till exempel row["col"], utöver positionsindexering och attributåtkomst.
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
Medföljande ODBC-drivrutinsuppgradering
Den medföljande Microsoft ODBC-drivrutinen för SQL Server uppdaterades till 18.6.2.1.
Felkorrigeringar
- Åtgärdade problem med livslängden för fördröjda connect-attribut i tokenbaserad autentisering.
- Åtgärdade upprepad tolkning av anslutningssträngen i autentiseringsflödet.
- Fasta
executemany()typannoteringar för sekvensindata.
mssql-python 1.7.1
Utgivningsdatum: maj 2026
Enhancements
Utökad hjultäckning och prestandaförbättringar
Denna version lägger till RHEL 8-kompatibla hjul, återställer macOS Python 3.10-hjuluniversal2, förbättrar UTF-16-hanteringen genom simdutf, och optimerar execute() hot path.
Prestandapåverkan: Batch-exekveringsgenomströmningen förbättras med ~15% på typiska arbetsbelastningar tack vare hot path-optimeringar i metoden execute() .
Felkorrigeringar
- Åtgärdade inloggningsfel så att de utlöser
mssql_pythonDB-API-undantag i stället förRuntimeError. - Utökad GIL-frigivning vid blockerande ODBC-anrop för körning, hämtning, transaktioner och anslutningsattribut.
- Åtgärdade fel med
executemany()när decimalvärden byter tecken. - Åtgärdade inkonsekvent avkodning av CP1252
VARCHARmellan plattformar. - Åtgärdade
cursor.bulkcopy()fel för tomma strängar iNVARCHAR(MAX)ochVARCHAR(MAX)kolumner.
Note
Version 1.7.0 drogs tillbaka på grund av publiceringsproblem. Använd version 1.7.1 eller senare.
mssql-python 1.6.0
Utgivningsdatum: april 2026
Enhancements
Parserbaserad rensning av anslutningssträng
Denna förbättring säkerställer korrekt tolkning av specialtecken i lösenordsfält och förstärkta värden.
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"
)
Rensning av anslutningssträngar flyttades från regex-baserad logik till parser-baserad bearbetning för korrekt hantering av ODBC-anslutningssträngssyntax.
Felkorrigeringar
- Åtgärdade GIL-frigörelse vid blockerande ODBC-anslutnings- och frånkopplingsåtgärder.
- Fixade
setinputsizes()krascher medSQL_DECIMALochSQL_NUMERICledtrådar. - Korrigerade felaktigt
fetchone()beteende för ODBC-katalogmetoder. - Åtgärdade fel med ogiltigt markörtillstånd när
reset_cursor=Falseanvändes. - Fasta
executemany()typ-ledtrådar för mappningsbaserade parametersekvenser. - La till ett skydd mot sökvägstraversering för
setup_logging(log_file_path=...).
mssql-python 1.5.0
Utgivningsdatum: april 2026
Nya funktioner
Stöd för hämtning med Apache Arrow
Tre nya cursormetoder erbjuder högpresterande hämtning av kolumnbaserad data genom Arrow C Data Interface:
-
cursor.arrow()returnerar ett komplettpyarrow.Table. -
cursor.arrow_batch()returnerar en endapyarrow.RecordBatch. -
cursor.arrow_reader()returnerar enpyarrow.RecordBatchReaderför strömning.
Implementeringen kringgår Python-objektskapande i hot path för förbättrad prestanda. För fullständig dokumentation, se Apache Arrow-integration.
stöd för typen sql_variant
Drivrutinen upptäcker nu sql_variant kolumner vid hämtning, fastställer deras underliggande bastyp och returnerar korrekt typade Python-värden i stället för råa byte.
Note
sql_variant Kolumner använder en strömmande hämtaväg, vilket kan ha en liten prestandapåverkan jämfört med kolumner av fast typ.
Inbyggt UUID-stöd
En ny native_uuid-inställning styr om kolumnerna UNIQUEIDENTIFIER returneras som uuid.UUID-objekt (standard) eller som pyodbc-kompatibla strängar med versaler. Konfigurera den på modulnivå eller per anslutning:
# 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)
För mer information, se Modulkonfiguration.
Radklass offentlig export
Klassen Row exporteras nu på högsta nivå för typannotationer:
from mssql_python import Row
Felkorrigeringar
- Åtgärdade felaktig identifiering av
?i hakparentesomslutna identifierare, strängliteraler och kommentarer. - Fixerad NULL-parameterbindning för
VARBINARYkolumner (ger inte längre implicita konverteringsfel). - Åtgärdade att
datetime.time-värden förlorade mikrosekunder vid tur- och returkonvertering för kolumner frånTIME(1)tillTIME(7). - Åtgärdade hämtningsvägen för Arrow så att den korrekt inkluderar sekundbråkdelar i
TIME-kolumner. - Fixad bulkkopiering med autentiseringsmetoder för Microsoft Entra ID (föråldrade inloggningsfält orsakar inte längre valideringsfel).
- Cachade Azure Identity-inloggningsinstanser på modulnivå för förbättrad autentiseringsprestanda.
mssql-python 1.4.0
Releasedatum: mars 2025
Nya funktioner
Stöd för masskopiering
Högpresterande bulkdataladdning finns nu tillgänglig genom 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")
Metoden accepterar alternativ för batch_size, , , timeout, column_mappings, keep_identity, check_constraintstable_lock, , keep_nulls, och fire_triggersuse_internal_transaction.
Se Masskopiering för fullständig dokumentation.
Improvements
- Prestandaoptimeringar för stora resultatmängder.
- Minskad minnesanvändning under batchoperationer.
- Förbättrade felmeddelanden för bulkkopieringsfel.
mssql-python 1.3.0
Releasedatum: januari 2025
Nya funktioner
Inställningsklass
Konfigurera modulövergripande beteende genom den nya Settings klassen:
import mssql_python
settings = mssql_python.get_settings()
settings.lowercase = True # Lowercase column names in cursor.description
Se Modulkonfiguration för detaljer.
Improvements
- Bättre hantering av anslutningstidsavbrott under Azure SQL-failover.
- Förbättrad kompatibilitet med Python 3.13.
mssql-python 1.2.0
Releasedatum: november 2024
Nya funktioner
Metoder för schemaupptäckt
Nya markörmetoder för databasmetadatautforskning:
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()
Se Schema-upptäckt för fullständig dokumentation.
Improvements
- Förbättrad metadatacache för upprepade schemafrågor.
- Bättre hantering av beräknade kolumner i
columns()resultat.
mssql-python 1.1.0
Releasedatum: september 2024
Nya funktioner
Specialanpassade utgångsomformere
Registrera anpassade funktioner för att transformera kolumnvärden under hämtning:
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)
Hanteringsmetoder:
add_output_converter(sql_type, converter_func)get_output_converter(sql_type)remove_output_converter(sql_type)clear_output_converters()
För fullständig dokumentation, se Anpassade typkonverterare.
Improvements
- Bättre felmeddelanden vid misslyckade typkonverteringar.
- Stöd för omvandlarfunktioner som returnerar
None.
mssql-python 1.0.0
Releasedatum: juli 2024
Första GA-versionen
Den första allmänna tillgänglighetsversionen av mssql-python, Microsoft inbyggda Python-drivrutin för SQL Server.
Kärnfunktioner
- DDBC-arkitektur: Direkt databasanslutning utan att behöva installera ODBC-drivrutiner.
- DB-API 2.0-efterlevnad: Standard Python databasgränssnitt.
- Anslutningspoolning: Inbyggd anslutningspoolhantering.
- Microsoft Entra-autentisering: Fullt stöd för Azure-identitetsbaserad autentisering.
- TLS-kryptering: Säkra anslutningar med certifikatvalidering.
Anslutningsfunktioner
- 21 nyckelord för anslutningssträngar.
- 9 autentiseringsläge (SQL, Windows och 7 Microsoft Entra ID-metoder).
- Styrning av autocommit.
- Exekveringsmetoder:
execute(),executemany(), ochbatch_execute(). - Kopplingsattribut genom
set_attr()ochgetinfo(). - Stöd för kontexthanterare.
Markörfunktioner
- Standardmetoder för hämtning:
fetchone(),fetchmany(),fetchall(). - Utökade metoder:
fetchval(),skip(). - Exekveringsmetoder:
execute()ochexecutemany(). - Radobjekt med attribut- och indexåtkomst.
- Navigering med flera resultatuppsättningar med
nextset().
Stöd för datatyp
- Alla inbyggda typer i SQL Server.
- Python↔SQL-typmappningar.
- SQL-typkonstanter för explicit typning (till exempel
mssql_python.SQL_DECIMAL). - NULL-hantering i Python
None.
Transaktionsstöd
- Manuell incheckning och återställning.
- Autocommit-läge.
- Isoleringsnivåkontroll.
- Upptäckt och hantering av deadlock.
Autentiseringslägen
| Mode | Beskrivning |
|---|---|
| SQL Server-autentisering | Användarnamn och lösenord |
| Windows authentication | Trusted_Connection |
| ActiveDirectoryDefault | DefaultAzureCredential |
| ActiveDirectoryInteractive | Webbläsarbaserad inloggning |
| ActiveDirectoryDeviceCode | Enhetskodflöde |
| ActiveDirectoryPassword | Microsoft Entra användarnamn och lösenord (föråldrat; använder ROPC) |
| ActiveDirectoryMSI | Hanterad identitet |
| ActiveDirectoryServicePrincipal | Service Principal |
| ActiveDirectoryIntegrated | Windows Kerberos |
Upgrade
Från pyodbc
För detaljerad migrationsvägledning, se Migrera från pyodbc.
Viktiga skillnader:
- Både
?(qmark) och%(name)s(pyformat) parameterstilar stöds. Dina befintliga?frågor fungerar utan ändringar. - Ingen
callproc()metod. AnvändEXECUTE-satser i stället. - Inbyggd anslutningspooling.
- Inget beroende av extern ODBC-drivrutin.
Från pymssql
För detaljerad migreringsguidning, se Migrera från pymssql.
Viktiga skillnader:
- Byt ut
%soch%dparametermarkörer med?eller%(name)s. - Använd en reťazec pripojenia istället för positionsargument.
- Inget FreeTDS-beroende.
- Flera samtidiga markörer per anslutning.
- Radobjekt med attributåtkomst ersätter
as_dict=True.
Mellan versioner av mssql-python
Uppgradera drivrutinen för att få nya funktioner och fixar.
pip install --upgrade mssql-python
Kolla versionsnoterna för eventuella brytande ändringar innan du uppgraderar produktionssystemen.
Roadmap
För kommande funktioner och utvecklingsplanen, se GitHub-arkivet.