Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
mssql-python wczytuje jednego z dwóch natywnych dostawców ODBC:
| Provider | Co to jest | Status |
|---|---|---|
msodbcsql18 |
Microsoft ODBC Driver 18 dla SQL Server, ugruntowany sterownik C++ | Domyślne; bez zmian |
mssql-odbc |
Nowy sterownik ODBC napisany w Rust | Zapowiedź, zgoda |
Ten artykuł omawia mssql-odbcwersję 0.3.0, obecnie używaną przez mssql-python, oraz to, czym różni się od msodbcsql18.
Note
mssql-odbc jest aktywnie rozwijany i walidowany. Nie jest to jeszcze całkowite zastąpienie Microsoft ODBC Driver 18. Na razie zostaw msodbcsql18 jako domyślne ustawienie dla środowiska produkcyjnego. Zespół deweloperski planuje usunąć braki w wersji zapoznawczej w nadchodzących wydaniach, z wyjątkiem celowych wykluczeń wyraźnie wskazanych w tym artykule.
Availability
Sterownik jest dostępny wewnątrz pakietu mssql-python-rs jako gotowe wheels dla CPython 3.10 i późniejszych:
| Platform | Architektury |
|---|---|
| Windows | x64; ARM64 na CPython 3.11+ |
| macOS | universal2 (x86_64 + arm64), macOS 15 lub nowszy |
| Linux (glibc) | x86_64, aarch64 — manylinux_2_28 oraz manylinux_2_34 |
| Linux (musl) | x86_64, aarch64 — musllinux_1_2 |
Włączanie sterownika
Pakiet mssql-python zależy od mssql-python-rs, więc normalna instalacja przynosi ze sobą sterownik Rust:
pip install mssql-python
Jeśli instalujesz za pomocą --no-deps lub z prywatnego indeksu, jawnie zainstaluj również mssql-python-rs.
Wybierz dostawcę przed pierwszym połączeniem, albo za pomocą zmiennej środowiskowej:
Powershell:
$env:MSSQL_PYTHON_NATIVE_PROVIDER = "mssql-odbc"
Bash czy Zsh:
export MSSQL_PYTHON_NATIVE_PROVIDER=mssql-odbc
lub z Pythona:
import mssql_python
mssql_python.native_provider = "mssql-odbc"
Połącz się, używając istniejącego parametry połączenia swojej aplikacji. Zachowaj włączoną walidację certyfikatów (Encrypt=yes;TrustServerCertificate=no). Aby uzyskać informacje o uwierzytelnianiu i konfiguracji certyfikatów, zobacz Ciągi połączenia oraz Szyfrowanie i certyfikaty.
connection = mssql_python.connect(connection_string)
Kierowca stosuje następujące zasady przy wyborze dostawcy:
- Zmienna środowiskowa
MSSQL_PYTHON_NATIVE_PROVIDERma pierwszeństwo przednative_provider. Przypisanie atrybutów konfliktowych powodujeRuntimeWarning. - Wybór staje się ustalony po walidacji ciągu połączeń i tuż przed utworzeniem połączenia natywnego. Kolejna awaria połączenia nie usuwa zaznaczenia. Wcześniejszy błąd parsowania stringów połączeń lub brak pakietu dostawcy nie zmienia wyboru. Po ustaleniu selekcji zmiana
native_providerna innego dostawcę emitujeRuntimeWarningi nie ma żadnego efektu. Rozpocznij proces od nowa, aby zmienić dostawcę. - Nierozpoznana nazwa dostawcy podnosi
ValueError; sterownik nie przełącza się na domyślnego dostawcę. Nieznane imię przypisane donative_providernatychmiast zgłasza wyjątek. Nieznana nazwa w zmiennej środowiskowej powoduje błąd, gdy próbujesz się połączyć. - Ustaw
native_providernaNone, aby usunąć wybór atrybutów, zanim zostanie on ustalony. Zmienna środowiskowa nadal ma pierwszeństwo.
Kliknij mssql_python.get_native_provider_info(), aby sprawdzić wybranego dostawcę, źródło wyboru oraz czy selekcja jest stała. Przed połączeniem ten komunikat raportuje wybór, a nie dowód, że natywny sterownik został pomyślnie załadowany.
Aby cofnąć się, ustaw zmienną na msodbcsql18, lub usuń jej ustawienie i usuń dowolne native_provider przypisania z kodu (albo ustaw ją na "msodbcsql18").
Następnie rozpocznij proces od nowa.
Co działa dziś
Sterownik mssql-odbc implementuje każdą funkcję ODBC wywoływaną przez mssql-python, dzięki czemu większość aplikacji może zmieniać dostawców bez zmian w kodzie. Sprawdź Znane problemy, aby sprawdzić pozostałe różnice.
| Area | Notes |
|---|---|
| Cykl życia połączenia | Connect, close(), with blocks, limit czasu logowania, diagnostyka i zmiana aktualnej bazy danych. Ustawienia łańcucha połączeń obejmują ApplicationIntent, MultiSubnetFailover, IpAddressPreference, PacketSize, KeepAlive, oraz ConnectRetryCount / ConnectRetryInterval (odporność bezczynnego połączenia). |
| Authentication | uwierzytelnianie SQL (UID / PWD); uwierzytelnianie systemu Windows (Trusted_Connection=Yes, przy użyciu SSPI w systemie Windows lub Kerberos w systemie Linux i macOS); oraz interakcyjne uwierzytelnianie Microsoft Entra, kod urządzenia, jednostka usługi, tożsamość zarządzana, domyślne poświadczenia i token dostępu. Uwierzytelnianie zintegrowane Entra i uwierzytelnianie hasłem nie są obsługiwane; zobacz Znane problemy. |
| magazyn lokalny wątku |
Encrypt, TrustServerCertificate, HostnameInCertificate i ServerCertificate. |
| Wykonywanie zapytania | Bezpośrednia i przygotowana realizacja, ponowne użycie przygotowanego planu, parametry qmark oraz konwersja wykonywana przez pyformatmssql-python. |
| Składnia sekwencji ucieczki ODBC | Funkcja, data/czas, outer-join, GUID, LIKE ... {escape ...}, interwał oraz {encrypt ...} formy escape. |
| Procedury przechowywane | Wołaj je za pomocą składni T-SQL lub pozycyjnej {call ...} przez execute(), odczytuj zbiory wyników i przesuwaj się za pomocą nextset(). |
| Parametry wejściowe | Parametry skalarne, SQL NULL, setinputsizes(), oraz mieszane parametry regularne/streamowane. |
| Duże parametry | Duży tekst i parametry binarne przesyłane są do serwera na zwykłej ścieżce wiązania; Ograniczenia parametrów XML i UDT są wymienione poniżej. |
executemany() |
Przetwarzane partiami z macierzami parametrów ODBC. Wiersze zawierające wartości strumieniowe wracają do wykonywania wiersz po wierszu. |
| Pobieranie wierszy |
fetchone(), fetchmany(), fetchall(), iteracja, fetchval(), konwersja typu oraz duże strumieniowanie tekstowe/binarne. |
| Pobieranie strzałek |
arrow_batch(), arrow() oraz arrow_reader(). Wymaga pyarrow. |
| Wiele zestawów wyników |
nextset(), w tym wyniki uzyskane przez tablice parametrów. |
| Transakcje | Autocommit, commit, rollback, automatyczny commit (lub rollback, jeśli wystąpił błąd), który następuje po zakończeniu bloku with connect(...), oraz poziomy izolacji read-uncommitted, read-committed, repeatable-read, serializable i snapshot isolation. |
| Przekroczenie limitu czasu zapytania | Ustaw Connection.timeout (w sekundach), aby ograniczyć instrukcje wykonywane przez kursory tego połączenia; wygaśnięcie zgłasza wyjątek OperationalError.
0 oznacza brak limitu czasu. To ustawienie jest oddzielne od limitu czasu logowania przekazywanego jako connect(timeout=...). |
| Buforowanie połączeń | Wbudowana pulamssql-python, w tym reset połączenia podczas pobierania z puli oraz oddzielne pule dla tożsamości Microsoft Entra. |
| API metadanych |
tables(), columns(), primaryKeys(), foreignKeys(), statistics(), rowIdColumns(), rowVerColumns(), procedures(), i getTypeInfo(). |
| Kodowanie i konwertery | Domyślne kodowanie szerokoznakowe i konwertery wyjściowe. Niestandardowe dekodowanie znaków wąskich oraz konwersja parametrów nie-Unicode mają ograniczenia wymienione w sekcji Znane problemy. |
Typy danych
Możesz odczytać wszystkie typy danych SQL Server, a sterownik obsługuje każdy typ parametrów, który wiąże mssql-python. Sterownik zwraca wartości xml, vector oraz str jako vector (geometry jako tablica JSON) oraz typy CLR takie jak geography, hierarchyid oraz bytes jako json. Aby poznać inne mapowania w Python, zobacz mapowania typów danych.
Ograniczenia dotyczące poszczególnych typów: zobacz Znane problemy.
Znane problemy
Sprawdź te różnice przed przeniesieniem obciążenia z msodbcsql18.
| Issue | Details | Workaround |
|---|---|---|
| Zintegrowane uwierzytelnianie firmy Microsoft |
Authentication=ActiveDirectoryIntegrated nie jest obsługiwany. Uwierzytelnianie systemu Windows (Trusted_Connection=Yes) pozostaje bez zmian. |
Użyj innej metody Microsoft Entra lub zostaw msodbcsql18. |
| Microsoft Entra password authentication (Uwierzytelnianie haseł firmy Microsoft w usłudze Entra) |
Authentication=ActiveDirectoryPassword nie jest obsługiwane, a wsparcie nie jest planowane, ponieważ ta metoda nie spełnia wymagań MFA. Uwierzytelnianie SQL (UID / PWD) nie jest zmienione. |
Użyj innej metody Microsoft Entra, takiej jak jednostka usługi, zarządzana tożsamość lub token dostępu. |
attrs_before ustawienia |
Uwierzytelnianie, intencja aplikacji oraz przełączanie awaryjne wielu podsieci nie mogą być ustawiane jako atrybuty liczbowe. Atrybuty instrukcji inne niż timeout zapytania są odrzucane. | Użyj równoważnych słów kluczowych ciągu połączenia. |
| Przekroczono limit czasu operacji połączenia |
set_attr(SQL_ATTR_CONNECTION_TIMEOUT, ...) akceptuje i przechowuje wartość, ale nie wymusza timeoutu w wersji 0.3.0. |
Użyj connect(timeout=...) do logowania i Connection.timeout do wyciągów; żadne z nich nie jest ogólnym limitem czasu operacji połączenia. |
| Hosty wieloadresowe |
msodbcsql18 domyślnie włącza Transparent Network IP Resolution (TNIR); mssql-odbc nie obsługuje go.
mssql-python odrzuca TransparentNetworkIPResolution słowo kluczowe connection string u dowolnego z dostawców. Bez MultiSubnetFailover=Yes, adresy są próbowane pojedynczo, więc adres nieosiągalny może opóźnić połączenie. Wspomagane serwerowo buforowanie DNS i ulepszone trasowanie nie są negocjowane. |
Ustaw MultiSubnetFailover=Yes dla detektorów odbioru grupy dostępności i innych hostów wieloadresowych. |
| Tymczasowe awarie DNS | Jeśli wyszukiwanie DNS się nie powiedzie, sterownik nie przełącza się z powrotem na ostatni poprawny adres. (#457) | Ponów próbę nawiązania połączenia. |
| Klasyfikacja danych | Metadane klasyfikacji wrażliwości nie są dostępne, a SQL_COPT_SS_DATACLASSIFICATION_VERSION (1400) nie jest obsługiwane. |
Wyszukaj sys.sensitivity_classifications. |
| Wielowątkowość | Użycie wielowątkowe nie zostało zweryfikowane. | Zachowaj msodbcsql18 dla obciążeń wielowątkowych. |
fork() po połączeniu |
W Linuksie proces rozwidlony po tym, jak proces nadrzędny nawiąże połączenie, może się zawiesić podczas korzystania ze sterownika, nawet przy nowym połączeniu. Przy włączonym poolingu rodzic też może się zawiesić. (#566) | Użyj metody start spawn i nawiąż połączenie wewnątrz każdego workera. |
| Anulowanie bieżącej instrukcji | Nie można przerwać bieżącego zapytania ani pobierania. Na przykład zamknięcie arrow_reader() nie zatrzymuje odczytu będącego w toku w innym wątku. |
Użyj Connection.timeout, aby ograniczyć długotrwałe instrukcje. |
| Nieprzeczytane wyniki | Zamknięcie kursora lub uruchomienie kolejnego polecenia odczytuje i odrzuca pozostałe wyniki zamiast ich anulować, co może być powolne. Zamknięcie kursora, który używał przygotowanej instrukcji, ignoruje Connection.timeout i może się zawiesić, jeśli serwer przestanie odpowiadać. (#546) |
Pobierz tylko te wiersze, których potrzebujesz, na przykład za pomocą TOP. |
Parametry Large xml i UDT |
Wartości powiązane jako SQL_SS_XML lub SQL_SS_UDT przez setinputsizes() są buforowane w pamięci zamiast przesyłane strumieniowo. |
Powiąż xml wartości jako zwykłe ciągi znaków. |
Wartości puste image |
Pusta, nie-NULL wartość SQL Server image jest zwracana jako None, a nie jako b"". |
Przeczytaj CAST(image_column AS varbinary(max))lub użyj msodbcsql18 , gdy rozróżnienie puste/NULL ma znaczenie. |
| Parametry łańcuchów niebędących w standardzie Unicode | Ciągi oznaczone jako char / varchar do setinputsizes() mogą być nieprawidłowo kodowane dla stron kodowych 437, 850 oraz UTF-8. |
Użyj domyślnego wiązania ciągu. |
| Dekodowanie starszych stron kodowych na Windows | W przypadku setdecoding(SQL_CHAR, encoding="cp1252") lub innej starszej strony kodowej tekst może zostać błędnie zdekodowany lub zwrócony jako bytes, ponieważ sterownik zwraca dane char / varchar jako UTF-8. |
Użyj ustawienia domyślnego: conn.setdecoding(mssql_python.SQL_CHAR). |
Connection.getinfo() |
SQL_USER_NAME zwraca parametr połączenia UID, a nie użytkownika bazy danych. Jest pusty, gdy żaden UID nie trafia do sterownika. Niektóre wartości zdolności i limity oparte na rozmiarze pakietów różnią się od msodbcsql18. |
Użyj SELECT USER_NAME() dla użytkownika bazy danych. |
| Awarie związane z brakiem pamięci | Niektóre niepowodzenia alokacji sterownika kończą proces Python zamiast zgłosić MemoryError. (#484) |
Ogranicz rozmiar wartości, które wysyłasz i pobierasz. |
| Wydajność odczytu dużych wartości | W jednym z benchmarków odczyty danych varchar(max) / nvarchar(max) w fragmentach były nieco wolniejsze niż w przypadku msodbcsql18. (#473) |
Przeprowadź test porównawczy swojego obciążenia. |
Ta lista nie jest wyczerpująca.
Zgłaszaj problemy
Jeśli napotkasz błąd, wybierz msodbcsql18, restartuj proces i sprawdź, czy zachowanie nadal występuje. Usuń też wszelkie przypisania dostawcy powodujące konflikt po stronie Pythona. Porównanie pomaga wyizolować problem; samo w sobie nie dowodzi jego przyczyny. Dołącz wynik mssql_python.get_native_provider_info(), informacje o swojej platformie oraz zapytanie SQL, które zakończyło się błędem, lub komunikat o błędzie:
- Problemy z sterownikiem Rust: https://github.com/microsoft/mssql-rs/issues
-
mssql-pythonProblemy: https://github.com/microsoft/mssql-python/issues
Do diagnostyki sterownika Rust ustaw te zmienne przed uruchomieniem Python i odtwórz problem z mssql-odbc wybranym. Na przykład w programie PowerShell:
$env:MSSQL_TDS_TRACE = "true"
$env:MSSQL_TDS_TRACE_LEVEL = "warn,mssqlodbc=debug"
$env:MSSQL_TDS_TRACE_DIR = "./traces"
MSSQL_TDS_TRACE Włącza śledzenie, MSSQL_TDS_TRACE_LEVEL wybiera filtr logów i MSSQL_TDS_TRACE_DIR zapisuje pliki dla każdego procesu zamiast STDERR.
Po zmianie tych ustawień zrestartuj Python. Ślady mogą zawierać tekst SQL i wartości parametrów. Przejrzyj i zanonimizuj wrażliwe dane przed udostępnieniem odpowiednich fragmentów oraz wyłącz śledzenie po diagnozie.