Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
mssql-python lädt einen von zwei nativen ODBC-Anbietern:
| Provider | Was es ist | Status |
|---|---|---|
msodbcsql18 |
Microsoft ODBC Driver 18 für SQL Server, der etablierte C++-Treiber | Standard, unverändert |
mssql-odbc |
Ein neuer ODBC-Treiber, geschrieben in Rust | Vorschau, Opt-in |
Dieser Artikel behandelt mssql-odbc0.3.0, die derzeit von mssql-python, verwendete Version, und was sich von msodbcsql18unterscheidet.
Note
mssql-odbc befindet sich in aktiver Entwicklung und Validierung. Es ist noch kein vollständiger Ersatz für Microsoft ODBC Driver 18. Behalte msodbcsql18 vorerst als Produktionsstandard bei. Das Entwicklungsteam plant, die Vorschaulücken in kommenden Veröffentlichungen zu schließen, abgesehen von absichtlich in diesem Artikel explizit genannten Ausnahmen.
Availability
Der Treiber wird im Paket mssql-python-rs als vorgefertigte Wheels für CPython 3.10 und später ausgeliefert:
| Platform | Architekturen |
|---|---|
| Windows | x64; ARM64 auf CPython 3.11+ |
| macOS | Universal2 (x86_64 + arm64), macOS 15 oder neuer |
| Linux (glibc) | x86_64, aarch64 – manylinux_2_28 und manylinux_2_34 |
| Linux (musl) | x86_64, aarch64 — musllinux_1_2 |
Treiber aktivieren
Das Paket mssql-python hängt von mssql-python-rsab, daher bringt eine normale Installation den Rust-Treiber mit:
pip install mssql-python
Wenn du mit --no-deps oder von einem privaten Index installierst, installiere auch mssql-python-rs explizit.
Wählen Sie den Anbieter vor der ersten Verbindung aus, entweder mit einer Umgebungsvariable:
Powershell:
$env:MSSQL_PYTHON_NATIVE_PROVIDER = "mssql-odbc"
Bash oder Zsh:
export MSSQL_PYTHON_NATIVE_PROVIDER=mssql-odbc
oder aus Python:
import mssql_python
mssql_python.native_provider = "mssql-odbc"
Verbinden Sie sich, indem Sie die bestehende Verbindungszeichenfolge Ihrer Anwendung verwenden. Zertifikatsvalidierung aktiviert lassen (Encrypt=yes;TrustServerCertificate=no). Für Authentifizierung und Zertifikatseinrichtung siehe Verbindungszeichenfolgen und Verschlüsselung und Zertifikate.
connection = mssql_python.connect(connection_string)
Der Treiber wendet bei der Auswahl des Anbieters folgende Regeln an:
- Die Umgebungsvariable
MSSQL_PYTHON_NATIVE_PROVIDERhat Vorrang vornative_provider. Eine widersprüchliche Attributzuweisung erzeugtRuntimeWarning. - Die Auswahl wird nach der Validierung des Verbindungsstrings und unmittelbar vor dem Aufbau der nativen Verbindung festgelegt. Ein anschließender Verbindungsfehler hebt die Auswahl nicht auf. Ein früherer Fehler beim Parsing von Verbindungszeichenfolgen oder ein fehlendes Provider-Paket behebt das Auswahlproblem nicht. Nachdem die Auswahl festgelegt ist, bewirkt ein Wechsel von
RuntimeWarningzu einem anderen Anbieternative_providerund hat keine Wirkung mehr. Starten Sie den Prozess neu, um den Anbieter zu wechseln. - Ein nicht anerkannter Anbietername löst
ValueErroraus; der Treiber fällt nicht auf den Standardanbieter zurück. Ein unbekannter Name, dernative_providerzugewiesen wird, löst sofort einen Fehler aus. Ein unbekannter Name in der Umgebungsvariable löst einen Fehler aus, wenn du versuchst, eine Verbindung herzustellen. - Setze
native_provideraufNone, um die Attributauswahl zu löschen, bevor sie fixiert wird. Die Umgebungsvariable hat weiterhin Vorrang.
Rufen Sie mssql_python.get_native_provider_info() auf, um den ausgewählten Anbieter, die Auswahlquelle und ob die Auswahl festgelegt ist, zu überprüfen. Vor der Verbindung wird die Auswahl angezeigt, nicht der Beweis, dass der native Treiber erfolgreich geladen wurde.
Um zurückzugehen, setze die Variable auf msodbcsql18, oder deaktiviere sie und entferne jede native_provider Zuweisung aus deinem Code (oder setze sie auf "msodbcsql18").
Dann starte den Prozess neu.
Was heute funktioniert
Der Treiber mssql-odbc implementiert jede ODBC-Funktion, die mssql-python aufruft, sodass die meisten Anwendungen ohne Codeänderungen den Provider wechseln können. Überprüfen Sie Bekannte Probleme auf die verbleibenden Unterschiede.
| Area | Notes |
|---|---|
| Verbindungslebenszyklus | Verbinden, close(), with Blocks, Anmelde-Timeout, Diagnostik und Änderung der aktuellen Datenbank. Verbindungszeichenfolgeeinstellungen umfassen ApplicationIntent, MultiSubnetFailover, IpAddressPreference, PacketSize, KeepAlive und ConnectRetryCount / ConnectRetryInterval (Leerlaufverbindungsresilienz). |
| Authentication | SQL-Authentifizierung (UID / PWD); Windows-Authentifizierung (Trusted_Connection=Yes, unter Verwendung von SSPI unter Windows oder Kerberos unter Linux und macOS); sowie Microsoft Entra interaktiv, Gerätecode, Service Principal, verwaltete Identität, Standardzugangsdaten und Zugriffstoken. Entra-Integration und Kennwortauthentifizierung werden nicht unterstützt; siehe Bekannte Probleme. |
| TLS |
Encrypt, TrustServerCertificate, HostnameInCertificate und ServerCertificate. |
| Abfrageausführung | Direkte und vorbereitete Ausführung, Wiederverwendung von vorbereiteten Plänen, qmark Parameter und die von mssql-python durchgeführte pyformat Konvertierung. |
| ODBC-Escapesyntax | Funktion, Datum/Uhrzeit, Outer-Join, GUID, LIKE ... {escape ...}, Intervall und {encrypt ...}-Escape-Formen. |
| Gespeicherte Prozeduren | Rufen Sie sie mit T-SQL oder positionsbezogener {call ...} Syntax über execute() auf, lesen Sie Ergebnismengen und fahren Sie mit nextset() fort. |
| Eingabeparameter | Skalare Parameter, SQL NULL, setinputsizes(), und gemischte reguläre/gestreamte Parameter. |
| Große Parameter | Große Text- und Binärparameter strömen auf dem gewöhnlichen Bindungspfad an den Server; XML- und UDT-Parameterbeschränkungen sind unten aufgeführt. |
executemany() |
Gebündelt mit ODBC-Parameterarrays. Zeilen, die gestreamte Werte enthalten, greifen auf Zeilen-für-Zeilen-Ausführung zurück. |
| Zeilenabruf |
fetchone(), fetchmany(), fetchall(), Iteration, fetchval(), typisierte Konvertierung und großes Text-/Binär-Streaming. |
| Pfeil abrufen |
arrow_batch(), arrow()und arrow_reader(). Erfordert pyarrow. |
| Mehrere Ergebnismengen |
nextset(), einschließlich Ergebnissen, die von Parameterarrays erzeugt werden. |
| Transactions | Autocommit, Commit, Rollback, das automatische Commit (oder Rollback, falls ein Fehler nicht abgefangen wurde), das auftritt, wenn ein with connect(...) Block endet, sowie die Read-Uncommitted-, Read-Committed-, Repeatable-Read-, Serializable- und Snapshot-Isolationsstufen. |
| Zeitüberschreitung bei der Abfrage | Setzen Sie Connection.timeout (in Sekunden) so fest, dass die von den Cursorn dieser Verbindung ausgeführten Anweisungen begrenzt werden; bei Ablauf wird OperationalError ausgelöst.
0 bedeutet kein Timeout. Diese Einstellung ist separat von der Login-Zeitüberschreitung, die als connect(timeout=...) übergeben wird. |
| Verbindungspooling | Der integrierte mssql-python Pool, einschließlich der Verbindungszurücksetzung beim Checkout und separaten Pools gemäß Microsoft Entra-Identität. |
| Metadaten-APIs |
tables(), columns(), primaryKeys(), foreignKeys(), statistics(), rowIdColumns(), , rowVerColumns(), procedures()und getTypeInfo(). |
| Kodierung und Converter | Standardmäßige Wide-Character-Kodierung und Ausgabekonverter. Benutzerdefinierte schmale Zeichendekodierung und Nicht-Unicode-Parameterkonvertierung haben Einschränkungen, die in Bekannte Probleme aufgeführt sind. |
Datentypen
Man kann alle SQL Server-Datentypen lesen, und der Treiber unterstützt jeden Parametertyp, den mssql-python bindet. Der Treiber liefert die Werte xml, json und vector als str (vector als JSON-Array) sowie CLR-Typen wie geometry, geography und hierarchyid als bytes. Für andere Python-Mappings siehe Data Type Mappings.
Typspezifische Einschränkungen finden Sie unter Bekannte Probleme.
Bekannte Probleme
Überprüfen Sie diese Unterschiede, bevor Sie die Arbeitslast von msodbcsql18 umstellen.
| Issue | Details | Workaround |
|---|---|---|
| Integrierte Microsoft Entra-Authentifizierung |
Authentication=ActiveDirectoryIntegrated wird nicht unterstützt. Die Windows-Authentifizierung (Trusted_Connection=Yes) bleibt unbeeinträchtigt. |
Verwenden Sie eine andere Microsoft Entra-Methode, oder behalten Sie msodbcsql18. |
| Microsoft Entra Kennwort-Authentifizierung |
Authentication=ActiveDirectoryPassword wird nicht unterstützt, und Unterstützung ist nicht geplant, weil diese Methode MFA nicht erfüllen kann. SQL-Authentifizierung (UID / PWD) bleibt unbeeinträchtigt. |
Verwenden Sie eine weitere Microsoft Entra-Methode, wie einen Service Principal, eine verwaltete Identität oder ein Zugriffstoken. |
attrs_before Einstellungen |
Authentifizierung, Anwendungsabsicht und Multi-Subnet-Failover können nicht als numerische Attribute festgelegt werden. Anweisungsattribute außer dem Abfrage-Timeout werden abgelehnt. | Verwenden Sie die entsprechenden Schlüsselwörter für die Verbindungszeichenfolge. |
| Zeitüberschreitung beim Verbindungsvorgang |
set_attr(SQL_ATTR_CONNECTION_TIMEOUT, ...) akzeptiert und speichert den Wert, erzwingt aber in 0.3.0 kein Timeout. |
Verwenden Sie connect(timeout=...) für Login und Connection.timeout für Statements; keines von beiden ist eine allgemeine Verbindungs-Operation-Deadline. |
| Mehradress-Hosts |
msodbcsql18 aktiviert standardmäßig Transparent Network IP Resolution (TNIR); mssql-odbc unterstützt sie nicht.
mssql-python lehnt das TransparentNetworkIPResolution connection-string-Schlüsselwort bei beiden Anbietern ab. Ohne MultiSubnetFailover=Yes, werden Adressen einzeln ausprobiert, sodass eine nicht erreichbare Adresse die Verbindung verzögern kann. Serverunterstütztes DNS-Caching und verbessertes Routing werden nicht vereinbart. |
MultiSubnetFailover=Yes für Verfügbarkeitsgruppen-Listener und andere Multi-Adress-Hosts festlegen. |
| Vorübergehende DNS-Ausfälle | Wenn eine DNS-Abfrage fehlschlägt, fällt der Treiber nicht auf die zuletzt erfolgreiche Adresse zurück. (#457) | Wiederholen Sie die Verbindung. |
| Datenklassifizierung | Metadaten zur Sensitivitätsklassifikation sind nicht verfügbar und SQL_COPT_SS_DATACLASSIFICATION_VERSION (1400) wird nicht unterstützt. |
Abfrage sys.sensitivity_classifications. |
| Multithreading | Multithreaded-Nutzung wurde nicht validiert. | Behalte msodbcsql18 für Multithreaded-Workloads. |
fork() nach dem Anschließen |
Unter Linux kann ein Prozess, der geforkt wird, nachdem sich der Elternprozess verbunden hat, hängen, wenn er den Treiber verwendet, selbst bei einer neuen Verbindung. Mit aktiviertem Pooling kann auch der übergeordnete Prozess hängen. (#566) | Verwenden Sie die spawn Startmethode und stellen Sie in jedem Worker die Verbindung her. |
| Abbrechen einer laufenden Abfrage | Eine laufende Abfrage oder Fetch kann nicht unterbrochen werden. Zum Beispiel stoppt das Schließen von arrow_reader() nicht einen laufenden Lesevorgang in einem anderen Thread. |
Verwenden Sie Connection.timeout, um langlaufende Statements zu begrenzen. |
| Ungelesene Ergebnisse | Das Schließen eines Cursors oder das Ausführen einer anderen Anweisung liest und verwirft die verbleibenden Ergebnisse, anstatt sie abzubrechen, was langsam sein kann. Das Schließen eines Cursors, der eine vorbereitete Anweisung verwendet hat, ignoriert Connection.timeout und kann hängen, wenn der Server nicht mehr reagiert. (#546) |
Rufen Sie nur die benötigten Zeilen ab, zum Beispiel mit TOP. |
Große xml und UDT-Parameter |
Werte, die als SQL_SS_XML oder SQL_SS_UDT durch setinputsizes() gebunden sind, werden im Speicher gepuffert statt gestreamt. |
Binde xml Werte als gewöhnliche Zeichenfolgen. |
Leere imageWerte |
Ein leerer, nicht-NULL SQL Server-Wert image wird als b"" anstelle von None zurückgegeben. |
Lies CAST(image_column AS varbinary(max)), oder benutze msodbcsql18 , wenn die Unterscheidung zwischen Leere und NULL relevant ist. |
| Parameter für Nicht-Unicode-Zeichenfolgen | Zeichenketten, die an char / varchar bis setinputsizes() gebunden sind, können für Codepage 437, Codepage 850 und UTF-8-Kollationen falsch codiert werden. |
Benutze die Standard-Zeichenfolgenbindung. |
| Legacy-Codepage-Dekodierung unter Windows | Mit setdecoding(SQL_CHAR, encoding="cp1252") oder einer anderen alten Codepage kann Text falsch decodiert oder als bytes zurückgegeben werden, da der Treiber / charvarchar-Daten als UTF-8 zurückgibt. |
Verwenden Sie die Standardwahl: conn.setdecoding(mssql_python.SQL_CHAR). |
Connection.getinfo() |
SQL_USER_NAME gibt die Verbindungszeichenkette UIDzurück, nicht den Datenbankbenutzer. Es ist leer, wenn kein UID den Treiber erreicht. Einige Fähigkeitswerte und paketgrößenbasierte Grenzen unterscheiden sich von msodbcsql18. |
Verwenden Sie SELECT USER_NAME() für den Datenbankbenutzer. |
| Speichermangelfehler | Einige Fehler bei der Treiberallokation beenden den Python-Prozess, anstatt MemoryError auszulösen. (#484) |
Begrenze die Größe der Werte, die du sendst und abrufst. |
| Lesleistung bei großen Werten | In einem Benchmark waren die Chunk-Reads der varchar(max) / nvarchar(max) Daten etwas langsamer als mit msodbcsql18. (#473) |
Bewerte deine Arbeitslast. |
Diese Liste ist nicht vollständig.
Melden von Problemen
Wenn Sie auf einen Fehler stoßen, wählen Sie msodbcsql18, starten Sie den Prozess neu und prüfen Sie, ob das Verhalten weiterhin auftritt. Entferne außerdem alle widersprüchlichen Python-seitigen Provider-Zuweisungen. Der Vergleich hilft, das Problem zu isolieren; er beweist für sich genommen nicht dessen Ursache. Fügen Sie die Ausgabe von mssql_python.get_native_provider_info(), Ihre Plattform und die fehlerhafte SQL- oder Fehlermeldung hinzu:
- Probleme mit Rust-Treibern: https://github.com/microsoft/mssql-rs/issues
-
mssql-pythonProbleme: https://github.com/microsoft/mssql-python/issues
Für Rust-Treiber-Diagnostik setzen Sie diese Variablen vor dem Start von Python und reproduzieren Sie das Problem mit ausgewähltem mssql-odbc. Beispiel in PowerShell:
$env:MSSQL_TDS_TRACE = "true"
$env:MSSQL_TDS_TRACE_LEVEL = "warn,mssqlodbc=debug"
$env:MSSQL_TDS_TRACE_DIR = "./traces"
MSSQL_TDS_TRACE aktiviert die Nachverfolgung, MSSQL_TDS_TRACE_LEVEL wählt den Log-Filter aus und MSSQL_TDS_TRACE_DIR schreibt Dateien pro Prozess statt stderr.
Starte Python neu, nachdem du diese Einstellungen geändert hast. Traces können SQL-Text und Parameterwerte enthalten. Überprüfen und schwärzen Sie sensible Daten, bevor Sie relevante Auszüge teilen, und deaktivieren Sie das Nachverfolgen nach der Diagnose.