Co nowego w mssql-python

Każda wersja sterownika mssql-python wprowadza nowe funkcje, poprawę wydajności oraz poprawki błędów. Poniższe sekcje szczegółowo opisują każdą wersję.

mssql-python 1.11.0

Data premiery: lipiec 2026

Enhancements

Ulepszona semantyka menedżera kontekstu

with connection: teraz prawidłowo zatwierdza transakcje przy poprawnym zakończeniu i wycofuje je w przypadku wyjątku, co czyni go bardziej zgodnym z idiomami Pythona i przewidywalnym.

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

Poprawki błędów

  • Naprawiono zakleszczenie GIL w ścieżce zamykania ODBC (conn.close() i cursor.close()) oraz w SQLDescribeParam dla parametrów o wartości None w konfiguracjach tunelu SSH i przekazywania w procesie.
  • Naprawiono parametry NULL BINARY i VARBINARY w tabelach tymczasowych i zmiennych tabelowych. Gdy automatyczne określanie typu kończy się niepowodzeniem, sterownik generuje ostrzeżenie języka Python z jasnymi wskazówkami cursor.setinputsizes().
  • Naprawiono problem z import mssql_python na Apple Silicon przy czystej instalacji (regresja w wersji 1.8.0). Dołączone zależności ODBC dylib są teraz przepisywane ponownie dla architektur zarówno arm64, jak i x86_64.
  • Naprawiono zakleszczenie GIL w rdzeniu Rust, które powodowało zawieszanie się operacji kopiowania zbiorczego podczas uwierzytelniania za pomocą Authentication=ActiveDirectoryServicePrincipal.

mssql-python 1.10.0

Data wydania: czerwiec 2026 r.

Enhancements

ActiveDirectoryServicePrincipal wsparcie dla kopiowania masowego

cursor.bulkcopy() teraz obsługuje Authentication=ActiveDirectoryServicePrincipal, umożliwiając zbiorcze wstawianie przy użyciu poświadczeń jednostki usługi.

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

Poprawki błędów

  • Naprawiono obsługę danych niebędących ASCII VARCHAR i CHAR w ścieżce pobierania Arrow.
  • Stałe przerwy połączeń podczas operacji ładowania masowego.

mssql-python 1.9.0

Data wydania: czerwiec 2026 r.

Enhancements

Obiekty wierszy w kopiowaniu zbiorczym

cursor.bulkcopy() teraz bezpośrednio akceptuje pobrane obiekty Row zamiast wymagać ręcznej konwersji krotek.

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

Poprawki błędów

  • Obudowa z kółkami stałymi, więc simdutf zawsze jest statycznie połączona.
  • Stałe duże DECIMAL wstawki w executemany().
  • Naprawiono nieprawidłowe określanie typu zastępczego dla parametrów NULL.
  • Naprawiono cykle serializacji i deserializacji wyjątków.
  • Naprawiono nextset(), aby zachowywał PRINT komunikaty między zestawami wyników.
  • Poprawiono obsługę Row w ścieżce awaryjnej executemany() data-at-execution.
  • Naprawiono sprawdzanie typów metody fetch dla narzędzi do analizy statycznej.

mssql-python 1.8.0

Data wydania: maj 2026 r.

Enhancements

Wsparcie ActiveDirectoryMSI dla kopiowania masowego

cursor.bulkcopy() obsługuje teraz Authentication=ActiveDirectoryMSI dla tożsamości zarządzanych przypisanych przez system i przez użytkownika.

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

Indeksowanie wierszy za pomocą klucza tekstowego

Teraz możesz uzyskać dostęp do wartości wierszy według nazwy kolumny, na przykład row["col"], oprócz indeksowania pozycyjnego i dostępu do atrybutów.

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

Pakietowa aktualizacja sterownika ODBC

Dołączony sterownik Microsoft ODBC dla SQL Server został zaktualizowany do wersji 18.6.2.1.

Poprawki błędów

  • Naprawiono problemy z odroczonym czasem życia atrybutów połączenia w uwierzytelnianiu opartym na tokenach.
  • Naprawiono powtarzające się parsowanie parametry połączenia w ścieżce uwierzytelniania.
  • Stałe executemany() adnotacje typów dla wejść sekwencji.

mssql-python 1.7.1

Data wydania: maj 2026 r.

Enhancements

Rozszerzone pokrycie kół i poprawa osiągów

Ta wersja dodaje koła kompatybilne z RHEL 8, przywraca koła macOS Python 3.10universal2, poprawia obsługę UTF-16 dzięki simdutf, oraz optymalizuje ścieżkę execute() gorącą.

Wpływ na wydajność: Przepustowość przetwarzania wsadowego wzrasta o ~15% w przypadku typowych obciążeń dzięki optymalizacjom ścieżki krytycznej w metodzie execute().

Poprawki błędów

  • Naprawiono problem z niepowodzeniami logowania, dzięki czemu zgłaszają one wyjątki DB-API mssql_python zamiast RuntimeError.
  • Rozszerzono zwalnianie GIL podczas blokujących wywołań ODBC dotyczących wykonywania, pobierania, transakcji i atrybutów połączenia.
  • Naprawiono executemany() problemy występujące, gdy wartości dziesiętne zmieniają znak.
  • Naprawiono niespójne dekodowanie CP1252 VARCHAR na różnych platformach.
  • Naprawiono cursor.bulkcopy() niepowodzenia spowodowane pustymi ciągami w kolumnach NVARCHAR(MAX) i VARCHAR(MAX).

Note

Wersja 1.7.0 została wycofana z powodu problemów z publikacją. Użyj wersji 1.7.1 lub nowzej.

mssql-python 1.6.0

Data wydania: kwiecień 2026 r.

Enhancements

Oczyszczanie parametrów połączenia oparte na parserze

To ulepszenie zapewnia poprawne parsowanie znaków specjalnych w polach haseł i wartościach nawiasowych.

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

Oczyszczanie parametrów połączenia przeniesiono z logiki opartej na wyrażeniach regularnych do przetwarzania opartego na parserze, aby zapewnić prawidłową obsługę składni parametrów połączenia ODBC.

Poprawki błędów

  • Naprawiono zwolnienie GIL podczas blokowania operacji łączenia i rozłączania ODBC.
  • Naprawiono awarie związane z setinputsizes() oraz podpowiedziami SQL_DECIMAL i SQL_NUMERIC.
  • Naprawiono nieprawidłowe fetchone() zachowanie metod katalogowych ODBC.
  • Naprawiono błędy nieprawidłowego stanu kursora, gdy używano reset_cursor=False.
  • Stałe executemany() wskazówki typu dla sekwencji parametrów opartych na mapowaniu.
  • Dodano ochronę przejścia ścieżki dla setup_logging(log_file_path=...).

mssql-python 1.5.0

Data wydania: kwiecień 2026 r.

Nowe funkcje

Obsługa pobierania Apache Arrow

Trzy nowe metody kursorów zapewniają wysokowydajne pobieranie danych kolumnowych za pośrednictwem interfejsu danych Arrow C:

  • cursor.arrow() zwraca kompletny pyarrow.Table.
  • cursor.arrow_batch() zwraca pojedynczy pyarrow.RecordBatch.
  • cursor.arrow_reader() zwraca pyarrow.RecordBatchReader do przesyłania strumieniowego.

Implementacja omija tworzenie obiektów w Python na gorącej ścieżce, co poprawia wydajność. Pełną dokumentację można znaleźć w artykule o integracji z Apache Arrow.

Obsługa typu sql_variant

Sterownik wykrywa teraz kolumny sql_variant podczas pobierania, ustala ich bazowy typ i zwraca wartości Pythona o poprawnym typie zamiast surowych bajtów.

Note

Kolumny sql_variant używają ścieżki strumieniowego pobierania danych, co może nieznacznie wpływać na wydajność w porównaniu z kolumnami o stałym typie.

Natywne wsparcie UUID

Nowe native_uuid ustawienie decyduje, czy UNIQUEIDENTIFIER kolumny są zwracane jako uuid.UUID obiekty (domyślnie), czy jako ciągi znaków wielkich liter zgodnych z pyodbc. Konfiguruj go na poziomie modułu lub dla każdego połączenia:

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

Więcej informacji można znaleźć w sekcji Konfiguracja modułu.

Publiczny eksport klasy rzędowej

Klasa Row jest teraz eksportowana na poziomie głównym dla adnotacji typów:

from mssql_python import Row

Poprawki błędów

  • Naprawiono fałszywe wykrycia ? w identyfikatorach ujętych w nawiasy, literałach łańcuchowych i komentarzach.
  • Naprawiono wiązanie parametrów NULL dla kolumn VARBINARY (nie powoduje już błędów niejawnej konwersji).
  • Naprawiono problem utraty mikrosekund przez wartości datetime.time podczas konwersji tam i z powrotem w kolumnach od TIME(1) do TIME(7).
  • Naprawiono ścieżkę pobierania Arrow, aby poprawnie uwzględniała ułamki sekund dla kolumn TIME.
  • Naprawiłem kopiowanie masowe za pomocą metod uwierzytelniania Microsoft Entra ID (przestarzałe pola poświadczeń nie powodują już błędów walidacji).
  • Buforowano instancje poświadczeń Azure Identity na poziomie modułu w celu zwiększenia wydajności uwierzytelniania.

mssql-python 1.4.0

Data premiery: marzec 2025

Nowe funkcje

Wsparcie dla kopiowania masowego

Wysokowydajne ładowanie danych masowych jest teraz dostępne poprzez 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 akceptuje opcje dla batch_size, timeout, column_mappings, keep_identity, check_constraints, table_lock, keep_nulls, fire_triggersoraz .use_internal_transaction

Pełną dokumentację znajdziesz w sekcji Kopiowanie zbiorcze.

Ulepszenia

  • Optymalizacje wydajności dla dużych zbiorów wyników.
  • Zmniejszone zużycie pamięci podczas operacji wsadowych.
  • Ulepszone komunikaty o błędach dotyczące niepowodzeń podczas kopiowania zbiorczego.

mssql-python 1.3.0

Data premiery: styczeń 2025

Nowe funkcje

Klasa ustawień

Konfiguruj zachowanie całego modułu poprzez nową Settings klasę:

import mssql_python

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

Zobacz Konfigurację modułu dla szczegółów.

Ulepszenia

  • Lepsza obsługa limitu czasu połączenia podczas przełączania awaryjnego Azure SQL.
  • Poprawa kompatybilności z Python 3.13.

MSSQL-Python 1.2.0

Data premiery: listopad 2024

Nowe funkcje

Metody odkrywania schematów

Nowe metody eksploracji metadanych bazy danych kursorem:

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

Pełną dokumentację znajdziesz w sekcji Wykrywanie schematów.

Ulepszenia

  • Ulepszone buforowanie metadanych dla powtarzających się zapytań schematów.
  • Lepsza obsługa kolumn obliczeniowych w wynikach columns().

mssql-python 1.1.0

Data premiery: wrzesień 2024

Nowe funkcje

Niestandardowe przetworniki wyjściowe

Rejestruj niestandardowe funkcje do transformacji wartości kolumn podczas pobierania:

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 zarządzania:

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

Pełną dokumentację można znaleźć w artykule Konwertery typów niestandardowych.

Ulepszenia

  • Lepsze komunikaty o błędach przy niepowodzeniach konwersji typów.
  • Obsługa funkcji konwerterów zwracających None.

MSSQL-Python 1.0.0

Data premiery: lipiec 2024

Pierwsze wydanie GA

Pierwsza ogólnodostępna wersja mssql-python, natywnego sterownika Python Microsoft dla SQL Server.

Podstawowe funkcje

  • Architektura DDBC: Bezpośrednia łączność z bazą danych bez konieczności instalacji sterownika ODBC.
  • Zgodność z DB-API 2.0: Standardowy interfejs bazy danych języka Python.
  • Pulowanie połączeń: Wbudowane zarządzanie pulą połączeń.
  • Uwierzytelnianie Microsoft Entra: Pełna obsługa uwierzytelniania opartego na tożsamości platformy Azure.
  • Szyfrowanie TLS: Bezpieczne połączenia dzięki walidacji certyfikatów.

Funkcje połączenia

  • 21 słów kluczowych ciągu połączenia
  • 9 trybów uwierzytelniania (SQL, Windows oraz 7 metod Microsoft Entra ID).
  • Sterowanie trybem autocommit.
  • Metody wykonania: execute(), executemany(), oraz batch_execute().
  • Atrybuty połączenia za pomocą set_attr() i getinfo().
  • Wsparcie dla menedżera kontekstu.

Funkcje kursora

  • Standardowe metody pobierania: fetchone(), fetchmany(), . fetchall()
  • Metody rozszerzone: fetchval(), . skip()
  • Metody wykonania: execute() oraz executemany().
  • Obiekty wierszowe z dostępem do atrybutów i indeksów.
  • Nawigacja po wielu zestawach wyników za pomocą nextset().

Obsługa typów danych

  • Wszystkie natywne typy SQL Server.
  • Mapowania typu Python ↔SQL.
  • Stałe typu SQL do typowania jawnego (na przykład mssql_python.SQL_DECIMAL).
  • Obsługa wartości NULL jak w Pythonie None.

Obsługa transakcji

  • Ręczne zatwierdzanie i wycofywanie.
  • Tryb automatycznego zatwierdzania zmian.
  • Kontrola poziomu izolacji.
  • Wykrywanie i obsługa zakleszczeń.

Tryby uwierzytelniania

Mode Opis
Uwierzytelnianie programu SQL Server Nazwa użytkownika i hasło
uwierzytelnianie Windows Trusted_Connection
ActiveDirectoryDefault DefaultAzureCredential
ActiveDirectoryInteractive Logowanie przez przeglądarkę
ActiveDirectoryDeviceCode Przepływ kodu urządzenia
ActiveDirectoryPassword Microsoft Entra — nazwa użytkownika i hasło (przestarzałe; używa ROPC)
ActiveDirectoryMSI Tożsamość zarządzana
ActiveDirectoryServicePrincipal Główna usługa
ActiveDirectoryIntegrated Windows Kerberos

Upgrade

Z pyodbc

Szczegółowe wskazówki dotyczące migracji znajdują się w artykule Migrate from pyodbc.

Kluczowe różnice:

  • Obsługiwane są zarówno style parametrów ? (qmark), jak i %(name)s (pyformat). Twoje istniejące ? zapytania działają bez zmian.
  • Brak metody callproc(). Zamiast tego używaj instrukcji EXECUTE.
  • Wbudowane łączenie połączeń.
  • Brak zewnętrznej zależności sterownika ODBC.

Z pymssql

Szczegółowe wskazówki dotyczące migracji znajdziesz w artykule Migrate from pymssql.

Kluczowe różnice:

  • Zastąp %s i %d markery parametrów na ? lub %(name)s.
  • Zamiast argumentów pozycyjnych używaj parametry połączenia.
  • Brak zależności od FreeTDS.
  • Wiele współbieżnych kursorów na połączenie.
  • Obiekty wierszowe z dostępem do atrybutów zastępują as_dict=True.

Między wersjami mssql-python

Zaktualizuj sterownik, aby uzyskać nowe funkcje i poprawki.

pip install --upgrade mssql-python

Sprawdź notatki do wydania pod kątem jakichkolwiek drobnych zmian przed aktualizacją systemów produkcyjnych.

Roadmap

Nadchodzące funkcje i plan rozwoju znajdziesz w repozytorium GitHub.