Co je nového v mssql-python

Každé vydání ovladače mssql-python přináší nové funkce, zlepšení výkonu a opravy chyb. Následující části podrobně popisují každou verzi.

mssql-python 1.12.0

Datum vydání: červenec 2026

Enhancements

Samostatný mssql-python-odbc doprovodný balíček

Binárky ovladačů ODBC, které mssql-python jsou potřeba za běhu, jsou nyní také publikovány jako samostatný, pouze datový doprovodný balíček: mssql-python-odbc (import name mssql_python_odbc, aktuálně připnutý k verzi 18.6.2). Balíček mssql-python deklaruje mssql-python-odbc==18.6.2 v install_requires, takže pip install mssql-python transparentně instaluje doprovodný balíček vedle něj. Nejsou vyžadovány žádné změny kódu.

Nativní zavaděč upřednostňuje externí balíček mssql_python_odbc, je-li k dispozici, a pokud ne, použije binární soubory ODBC, které jsou stále součástí balíčku wheel mssql-python. Záložní varianta je bezpečná s Python Global Interpreter Lock (GIL) a funguje na linuxových distribucích založených na musl, jako je Alpine.

Toto rozdělení umožňuje připnout nebo aktualizovat binární soubory ovladačů nezávisle na Python kódu, dává redistributorům menší mssql-python kolečko v průběhu času a zabraňuje problémům s vlastnictvím duplicit u přidaných ODBC souborů.

Důležité

To rozdělilo lodě bez jediné změny. V budoucím hlavním vydání (v2.0.0) může být balený libs/ strom odstraněn, v takovém případě mssql-python-odbc se stane tvrdým požadavkem na běh.

Opravy chyb

cursor.bulkcopy() Nyní používá časový limit připojení rodičovského připojení

Operace hromadného kopírování otevře samostatné připojení prostřednictvím nativního rozšíření mssql_py_core. Dříve tato operace vždy používala pevně zakódovaný 15sekundový timeout připojení bez možnosti přepsat ho v Python. Pokud nastavíte časový limit připojení na rodičovském připojení (),connect(..., timeout=<seconds>)bulkcopy() nyní tuto hodnotu přepošlete do interního připojení. Nastavení timeout=0 zachovává chování bez přepsání a zachovává interní výchozí 15sekundovou dobu. Pro tuto operaci se použije časový limit kurzoru platný v okamžiku volání bulkcopy(), takže pozdější změny v nadřazeném připojení neovlivní právě probíhající operaci hromadného kopírování.

Následující příklad používá vyhledávací tabulku Production.Culture z ukázkové databáze AdventureWorks. Upravte připojovací řetězec a název databáze pro vaše prostředí:

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() podporuje uživatelsky definované sloupce typu CLR

Dříve u Protocol Error: Unsupported TDS type for bulk copy: 0xF0 docházelo k selhání cursor.bulkcopy() pro libovolný cílový sloupec, který používal uživatelsky definovaný typ CLR, včetně vestavěných typů geography, geometry a hierarchyid a jakéhokoli vlastního typu CLR UDT registrovaného v sestavení. Nativní mssql_py_core drátová cesta neměla handler pro UDT typ token (0xF0) a při zápisu metadat sloupců došlo k chybě před odesláním řádků. Sloupce CLR UDT se nyní při přenosu mapují na varbinary(max) a poskytované bajty se přenášejí jako datová část UDT IBinarySerialize, stejně jako pyodbc a python-tds načítají sloupce UDT. SQL Server materializuje UDT při vložení. Dodáno prostřednictvím mssql_py_core aktualizace z 0.1.6 na 0.1.7.

Následující příklad archivuje sloupec org-chart z tabulky HumanResources.Employee (sloupec typu hierarchyid, jeden z vestavěných CLR UDT systému SQL Server) do nové tabulky. V reálném workflow mohou bajty UDT pocházet z jiné instance SQL Server, serializovaného souboru nebo výstupu IBinarySerialize.Write() vašeho CLR typu; tento příklad je čte z existujícího sloupce via CAST(... AS varbinary(max)) tak, aby byl vzorek samostatný. Hromadná kopie obsahuje řádek, jehož OrganizationNode je 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")

Pro vlastní CLR UDT registrovaný v assembleru použijte typ v cílové tabulce a dodajte bajty vytvořené metodou daného typu IBinarySerialize.Write() .

mssql-python 1.11.0

Datum vydání: červenec 2026

Enhancements

Zlepšená sémantika správce kontextu

with connection: nyní správně potvrzuje transakce při korektním ukončení a při výjimce je vrací zpět, takže je to více v souladu s Pythonem a předvídatelnější.

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

Opravy chyb

  • Bylo opraveno uváznutí na GIL při ukončování ODBC (conn.close() a cursor.close()) a v SQLDescribeParam pro parametry s hodnotou None v konfiguracích se SSH tunelem a s in-process forwarderem.
  • Pevné BINARY a VARBINARY NULL parametry v dočasných tabulkách a tabulkových proměnných. Když automatické určení typu selže, ovladač nyní vygeneruje varování Pythonu s explicitními pokyny cursor.setinputsizes().
  • Opravena chyba, kdy import mssql_python na Apple Silicon selhávalo při čisté instalaci (regrese v 1.8.0). Závislosti přibalené knihovny ODBC dylib jsou nyní přepsány pro architektury arm64 i x86_64.
  • Opraveno uváznutí GIL v jádru v Rustu, které při autentizaci pomocí Authentication=ActiveDirectoryServicePrincipal způsobovalo zamrznutí operací hromadného kopírování.

mssql-python 1.10.0

Datum vydání: červen 2026

Enhancements

Podpora hromadného kopírování v ActiveDirectoryServicePrincipal

cursor.bulkcopy() nyní podporuje Authentication=ActiveDirectoryServicePrincipal, což umožňuje hromadné vkládání dat pomocí přihlašovacích údajů instančního objektu služby.

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")

Opravy chyb

  • Byla opravena data obsahující znaky mimo ASCII v VARCHAR a CHAR v cestě načítání Arrow.
  • Pevné časové limity připojení během operací hromadného zatížení.

MSSQL-Python 1.9.0

Datum vydání: červen 2026

Enhancements

Řádkové objekty v hromadné kopii

cursor.bulkcopy() nyní přijímá načítané objekty Row přímo místo nutnosti ruční převodu n-tic.

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")

Opravy chyb

  • Pevné pouzdro koleček, takže simdutf je vždy staticky propojené.
  • Pevné DECIMAL velké inserty v executemany().
  • Opraven nesprávný type-fallback pro NULL parametry.
  • Opraveny problémy při serializaci a deserializaci výjimek.
  • Opraveno nextset() tak, aby se PRINT zprávy uchovávaly napříč sadami výsledků.
  • Opraveno zpracování Row v záložní větvi executemany() pro data za běhu.
  • Opravena kontrola typů metody fetch pro nástroje statické analýzy.

mssql-python 1.8.0

Datum vydání: květen 2026

Enhancements

Podpora hromadného kopírování v ActiveDirectoryMSI

cursor.bulkcopy() nyní podporuje Authentication=ActiveDirectoryMSI systémově a uživatelem přiřazené spravované identity.

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")

Indexování řádků pomocí řetězcových klíčů

Nyní můžete přistupovat k hodnotám řádků podle názvu sloupce, například row["col"], kromě pozičního indexování a přístupu k atributům.

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

Balíček pro upgrade ovladačů ODBC

Přibalený ovladač Microsoft ODBC pro SQL Server byl aktualizován na verzi 18.6.2.1.

Opravy chyb

  • Opraveny problémy se životností odloženého atributu připojení v autentizaci založené na tokenech.
  • Opraveno opakované parsování připojovací řetězec v autentizační cestě.
  • Fixní executemany() typové anotace pro vstupy sekvencí.

mssql-python 1.7.1

Datum vydání: květen 2026

Enhancements

Rozšířené pokrytí kol a zlepšení výkonu

Tato verze přidává volanta kompatibilní s RHEL 8, obnovuje volanty macOS Python 3.10universal2, zlepšuje ovládání UTF-16 prostřednictvím simdutf, a optimalizuje horkou cestuexecute().

Dopad na výkon: Propustnost dávkového vykonávání se zlepšuje o ~15% u typických pracovních zátěží díky optimalizaci horké cesty v metodě execute() .

Opravy chyb

  • Byla opravena selhání přihlášení tak, aby vyvolávala výjimky DB-API mssql_python místo RuntimeError.
  • Rozšířené uvolnění GIL napříč blokováním volání atributů ODBC při vykonávání, načítání, transakcích a připojení.
  • Opraveny executemany() chyby při změně znaménka desetinných hodnot.
  • Opraveno nekonzistentní dekódování CP1252 VARCHAR napříč platformami.
  • Opravené cursor.bulkcopy() chyby pro prázdné řetězce v NVARCHAR(MAX) a VARCHAR(MAX) sloupcích.

Note

Verze 1.7.0 byla stažena kvůli problémům s publikací. Použijte verzi 1.7.1 nebo novější.

mssql-python 1.6.0

Datum vydání: duben 2026

Enhancements

Sanitizace připojovací řetězec založená na parseru

Toto vylepšení zajišťuje správné parsování speciálních znaků v polích pro hesla a v závorkových hodnotách.

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"
)

Čištění připojovacího řetězce bylo přesunuto z logiky založené na regulárních výrazech na zpracování založené na parseru, aby byla správně zpracována syntaxe připojovacího řetězce ODBC.

Opravy chyb

  • Opraveno uvolnění GIL během blokování operací ODBC připojení a odpojení.
  • Opraveny pády související s nápovědami setinputsizes() a SQL_DECIMAL v SQL_NUMERIC.
  • Opraveno nesprávné fetchone() chování pro katalogové metody ODBC.
  • Byly opraveny chyby neplatného stavu kurzoru při použití reset_cursor=False.
  • Fixní executemany() tipy pro sekvence parametrů založené na mapování.
  • Přidána ochrana proti průchodu adresářovou strukturou pro setup_logging(log_file_path=...).

mssql-python 1.5.0

Datum vydání: duben 2026

Nové funkce

Podpora načítání Apache Arrow

Tři nové metody kurzoru poskytují vysoce výkonné sloupcové vyhledávání dat prostřednictvím rozhraní Arrow C Data Interface:

  • cursor.arrow() vrátí kompletní pyarrow.Table.
  • cursor.arrow_batch() Vrátí jedno pyarrow.RecordBatch.
  • cursor.arrow_reader() vrací pyarrow.RecordBatchReader pro streamování.

Implementace v kritické části kódu vynechává vytváření objektů Pythonu, aby se zvýšil výkon. Pro kompletní dokumentaci viz integrace Apache Arrow.

podpora typu sql_variant

Ovladač nyní detekuje sql_variant sloupce při načítání, rozlišuje jejich základní typ a vrací správně zadané hodnoty v Python místo surových bajtů.

Note

sql_variant Sloupce používají streamovanou cestu načítaní, která může mít mírný dopad na výkon ve srovnání s pevně danými sloupci.

Nativní podpora UUID

Nové nastavení native_uuid určuje, zda se sloupce UNIQUEIDENTIFIER vracejí jako objekty uuid.UUID (výchozí), nebo jako řetězce psané velkými písmeny kompatibilní s pyodbc. Konfigurujte ho na úrovni modulu nebo podle připojení:

# 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)

Pro více informací viz Konfigurace modulu.

Veřejný export třídy řádku

Třída Row je nyní exportována na nejvyšší úrovni pro typové anotace:

from mssql_python import Row

Opravy chyb

  • Opravena chybná detekce ? uvnitř identifikátorů v závorkách, řetězcových literálů a komentářů.
  • Pevné přiřazení NULL parametrů pro VARBINARY sloupce (již nezpůsobuje implicitní konverzní chyby).
  • Opraven problém, kdy hodnoty datetime.time při zpětném převodu ztrácely mikrosekundy u sloupců od TIME(1) do TIME(7).
  • Byla opravena cesta načítání Arrow, aby správně zahrnovala zlomkové sekundy pro sloupce TIME.
  • Opraveno hromadné kopírování pomocí autentizačních metod Microsoft Entra ID (zastaralá přihlašovací pole už nezpůsobují chyby validace).
  • Cacheované instance přihlašovacích údajů Azure Identity na úrovni modulu pro lepší výkon autentizace.

mssql-python 1.4.0

Datum vydání: březen 2025

Nové funkce

Podpora hromadného kopírování

Vysoce výkonné hromadné načítání dat je nyní dostupné prostřednictvím 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")

Metoda přijímá možnosti pro batch_size, timeout, column_mappings, keep_identity, check_constraints, table_lock, keep_nulls, fire_triggersa .use_internal_transaction

Kompletní dokumentaci naleznete v Hromadné kopii .

Vylepšení

  • Optimalizace výkonu pro velké sady výsledků.
  • Snížení spotřeby paměti během dávkových operací.
  • Vylepšené chybové zprávy při selhání hromadného kopírování.

mssql-python 1.3.0

Datum vydání: leden 2025

Nové funkce

Třída nastavení

Konfigurujte chování v celém modulu prostřednictvím nové Settings třídy:

import mssql_python

settings = mssql_python.get_settings()
settings.lowercase = True       # Lowercase column names in cursor.description

Podrobnosti viz Konfigurace modulu .

Vylepšení

  • Lepší řešení vypršení připojení během failoveru Azure SQL.
  • Zlepšená kompatibilita s Python 3.13.

mssql-python 1.2.0

Datum vydání: listopad 2024

Nové funkce

Metody objevování schémat

Nové metody kurzoru pro průzkum metadat databáze:

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()

Viz Schema discovery pro kompletní dokumentaci.

Vylepšení

  • Vylepšené cachování metadat pro opakované dotazy na schémata.
  • Lepší zpracování vypočítaných sloupců ve výsledcích columns().

mssql-python 1.1.0

Datum vydání: září 2024

Nové funkce

Vlastní výstupní měniče

Registrujte vlastní funkce pro transformaci hodnot sloupců během načítání:

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)

Metody řízení:

  • add_output_converter(sql_type, converter_func)
  • get_output_converter(sql_type)
  • remove_output_converter(sql_type)
  • clear_output_converters()

Pro kompletní dokumentaci viz Custom Type Converters.

Vylepšení

  • Lepší chybové zprávy při selhání převodu typů.
  • Podpora funkcí převodníku, které vracejí None.

mssql-python 1.0.0

Datum vydání: červenec 2024

První vydání GA

První všeobecně dostupná verze mssql-python, nativního Python ovladače Microsoft pro SQL Server.

Základní funkce

  • Architektura DDBC: Přímé připojení k databázi bez nutnosti instalace ovladačů ODBC.
  • Soulad s DB-API 2.0: Standardní databázové rozhraní Pythonu.
  • Sdružování připojení: Vestavěná správa fondu připojení.
  • Ověřování Microsoft Entra: Plná podpora ověřování na základě identity Azure.
  • TLS šifrování: Zabezpečené spojení pomocí ověřování certifikátů.

Funkce připojení

  • 21 klíčových slov připojovacího řetězce.
  • 9 autentizačních režimů (SQL, Windows a 7 metod Microsoft Entra ID).
  • Ovládání autocommitu.
  • Metody provádění: execute(), executemany(), a batch_execute().
  • Atributy připojení prostřednictvím set_attr() a getinfo().
  • Podpora správce kontextu.

Funkce kurzoru

  • Standardní metody načítání: fetchone(), fetchmany(), . fetchall()
  • Rozšířené metody: fetchval(), . skip()
  • Metody provádění: execute() a executemany().
  • Řádkové objekty s přístupem k atributům a indexům.
  • Navigace s množinou výsledků pomocí nextset().

Podpora datových typů

  • Všechny nativní typy pro SQL Server.
  • Mapování typů Python↔SQL.
  • SQL typové konstanty pro explicitní typování (například mssql_python.SQL_DECIMAL).
  • Zpracování hodnoty NULL stejně jako v Pythonu None.

Podpora transakcí

  • Ruční potvrzení a vrácení změn.
  • Režim automatického potvrzování.
  • Kontrola úrovně izolace.
  • Detekce a řešení zablokování.

Režimy ověřování

Mode Popis
Ověřování SQL Serveru Uživatelské jméno a heslo
Autentizace Windows Trusted_Connection
ActiveDirectoryDefault DefaultAzureCredential
ActiveDirectoryInteractive Přihlášení v prohlížeči
ActiveDirectoryDeviceCode Tok kódu zařízení
ActiveDirectoryPassword Microsoft Entra uživatelské jméno a heslo (zastaralé; používá ROPC)
ActiveDirectoryMSI Spravovaná identita
ActiveDirectoryServicePrincipal Hlavní služba
ActiveDirectoryIntegrated Windows Kerberos

Upgrade

Z pyodbc

Pro podrobné pokyny k migraci viz Migrate from pyodbc.

Hlavní rozdíly:

  • Podporovány jsou jak ? (qmark), tak (pyformat) styly %(name)s parametrů. Vaše stávající ? dotazy fungují bez změn.
  • Žádná callproc() metoda. Místo toho použijte příkazy EXECUTE.
  • Vestavěné sdružování připojení.
  • Žádná závislost na externím ODBC ovladači.

Z pymssql

Pro podrobné pokyny k migraci viz Migrate from pymssql.

Hlavní rozdíly:

  • Nahraďte značky parametrů %s a %d značkami ? nebo %(name)s.
  • Použijte připojovací řetězec místo pozičních argumentů.
  • Žádná závislost na FreeTDS.
  • Více současných kurzorů na jedno připojení.
  • Řádkové objekty s přístupem k atributům nahrazují as_dict=True.

Mezi verzemi mssql-python

Upgradujte ovladač pro nové funkce a opravy.

pip install --upgrade mssql-python

Před upgradem produkčních systémů si zkontrolujte poznámky k vydání, jestli se neobjeví nějaké zásadní změny.

Plán cesty

Pro nadcházející funkce a vývojový plán navštivte repozitář GitHub.