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.
mssql-python laddar en av två interna ODBC-leverantörer:
| Provider | Vad det är | Status |
|---|---|---|
msodbcsql18 |
Microsoft ODBC Driver 18 för SQL Server, den etablerade C++-drivrutinen | Standardvärde, oförändrad |
mssql-odbc |
En ny ODBC-drivrutin skriven i Rust | Förhandsvisning, anmäld |
Denna artikel täcker mssql-odbc0.3.0, den version som för närvarande används av mssql-python, och vad som skiljer sig från msodbcsql18.
Note
mssql-odbc är under aktiv utveckling och validering. Det är ännu inte en fullständig ersättning för Microsoft ODBC Driver 18. Behåll msodbcsql18 som din produktionsstandard för tillfället. Utvecklingsteamet planerar att täppa till förhandsvisningsluckorna i kommande versioner, förutom avsiktliga undantag som uttryckligen identifieras i denna artikel.
Availability
Drivrutinen levereras i mssql-python-rs-paketet som förbyggda hjul för CPython 3.10 och senare:
| Platform | Architectures |
|---|---|
| Windows | x64; ARM64 på CPython 3.11+ |
| macOS | Universal2 (x86_64 + arm64), macOS 15 eller senare |
| Linux (glibc) | x86_64, aarch64 — manylinux_2_28 och manylinux_2_34 |
| Linux (musl) | x86_64, aarch64 — musllinux_1_2 |
Aktivera drivrutinen
Paketet mssql-python är beroende av mssql-python-rs, så en vanlig installation tar med sig Rust-drivrutinen:
pip install mssql-python
Om du installerar med --no-deps eller från ett privat index, installera mssql-python-rs explicit också.
Välj leverantören före den första anslutningen, antingen med en miljövariabel:
Powershell:
$env:MSSQL_PYTHON_NATIVE_PROVIDER = "mssql-odbc"
Bash eller Zsh:
export MSSQL_PYTHON_NATIVE_PROVIDER=mssql-odbc
eller från Python:
import mssql_python
mssql_python.native_provider = "mssql-odbc"
Anslut genom att använda programmets befintliga anslutningssträng. Ha certifikatvalidering aktiverad (Encrypt=yes;TrustServerCertificate=no). För autentisering och certifikatuppsättning, se Anslutningssträngar och Kryptering och certifikat.
connection = mssql_python.connect(connection_string)
Drivrutinen tillämpar dessa regler när den väljer leverantör:
- Miljövariabeln
MSSQL_PYTHON_NATIVE_PROVIDERhar företräde framförnative_provider. En motstridig attributtilldelning gerRuntimeWarning. - Urvalet blir fast efter validering av anslutningssträngen och omedelbart innan den inbyggda anslutningen byggs. Ett efterföljande anslutningsfel tar inte bort valet. Ett tidigare misstag i anslutningssträngsparsning eller saknat leverantörspaket åtgärdar inte valet. När urvalet är fastställt utlöser byte av
RuntimeWarningtill en annan leverantörnative_provideroch har ingen effekt. Starta om processen för att byta leverantörer. - Ett okänt providernamn utlöser
ValueError; drivrutinen återgår inte till standardprovidern. Ett okänt tilldelat namn utlöser omedelbart ett fel närnative_provideranvänds. Ett okänt namn i miljövariabeln ger ett fel när du försöker ansluta dig. - Ställ
native_providerin påNoneför att rensa attributvalet innan det blir låst. Miljövariabeln gäller fortfarande före.
Anropa mssql_python.get_native_provider_info() för att inspektera den valda leverantören, markeringskällan och om markeringen är låst. Innan du ansluter rapporteras valet, inte som bevis på att den inbyggda drivrutinen har lästs in korrekt.
För att gå tillbaka, ställ in variabeln till msodbcsql18, eller avdefiniera den och ta bort alla native_provider-tilldelningar från din kod (eller ställ in den på "msodbcsql18").
Sedan startar du om processen.
Vad som fungerar idag
Drivrutinen mssql-odbc implementerar alla ODBC-funktioner som mssql-python anropar, så de flesta applikationer kan byta leverantör utan kodändringar. Se Kända problem för återstående skillnader.
| Area | Notes |
|---|---|
| Anslutningslivscykel | Anslutning, close(), with-block, inloggningstidsavbrott, diagnostik och ändring av den aktuella databasen. Anslutningssträngsinställningar inkluderar ApplicationIntent, MultiSubnetFailover, IpAddressPreference, PacketSize, KeepAlive och ConnectRetryCount / ConnectRetryInterval (resiliens för inaktiva anslutningar). |
| Authentication | SQL-autentisering (UID / PWD); Windows-autentisering (Trusted_Connection=Yes, med SSPI på Windows eller Kerberos på Linux och macOS); samt Microsoft Entra interaktiv, enhetskod, tjänstens huvudnamn, hanterad identitet, standardautentiseringsuppgift och åtkomsttoken. Entra-integrering och lösenordsautentisering stöds inte; se Kända problem. |
| TLS |
Encrypt, TrustServerCertificate, HostnameInCertificate och ServerCertificate. |
| Frågekörning | Direkt och förberedd körning, återanvändning av förberedda planer, qmark parametrar och konverteringen pyformatmssql-python utför. |
| ODBC-escape-syntax | Funktion, datum/tid, yttre join, GUID, LIKE ... {escape ...}, intervall och {encrypt ...} escape-formulär. |
| Lagrade procedurer | Anropa dem med T-SQL eller positionssyntax {call ...} genom execute(), läs resultatuppsättningar och gå vidare med nextset(). |
| Indataparametrar | Skalärparametrar, SQL NULL, setinputsizes(), och blandade vanliga/strömmade parametrar. |
| Stora parametrar | Stora text- och binära parametrar strömmar till servern via den vanliga bindningsvägen; XML- och UDT-parameterbegränsningar listas nedan. |
executemany() |
Batchkörs med ODBC-parameterarrayer. Rader som innehåller strömmade värden faller tillbaka på rad-för-rad-exekvering. |
| radhämtning |
fetchone(), fetchmany(), fetchall(), iterering, fetchval(), typad konvertering och stor text-/binärströmning. |
| Hämtning av pilar |
arrow_batch(), arrow() och arrow_reader(). Kräver pyarrow. |
| Flera resultatuppsättningar |
nextset(), inklusive resultat som produceras av parameterarrayer. |
| Transaktioner | Autocommit, commit, rollback, den automatiska commit (eller rollback, om ett fel har framkommit) som sker när ett with connect(...) block avslutas, samt read-uncommitted, read-committed, repeatable-read, serializable och snapshot isolation-nivåerna. |
| Tidsgräns för fråga | Ställ in Connection.timeout (i sekunder) för att begränsa SQL-satser som körs av den anslutningens kursorer; vid tidsgräns utlöses OperationalError.
0 betyder ingen timeout. Denna inställning är separat från inloggningstidsavbrottet som skickas som connect(timeout=...). |
| Anslutningspoolning | Den inbyggda poolen mssql-python, inklusive anslutningsåterställning vid hämtning från poolen och separata pooler per Microsoft Entra-identitet. |
| API:er för metadata |
tables(), columns(), primaryKeys(), foreignKeys(), statistics(), rowIdColumns(), rowVerColumns(), och procedures()getTypeInfo(). |
| Kodning och konverterare | Förvald kodning för breda tecken och utmatningsomvandlare. Anpassad smalteckensavkodning och icke-Unicode-parameterkonvertering har begränsningar listade i Kända problem. |
Datatyper
Du kan läsa alla SQL Server-datatyper, och drivrutinen stöder alla parametertyper som mssql-python binder. Drivrutinen returnerar xml, vector och str-värden som vector (geometry som en JSON-array), och CLR-typer som geography, hierarchyid och bytes som json. För andra Python-mappningar, se Datatypmappningar.
För typspecifika begränsningar, se Kända problem.
Kända problem
Kontrollera dessa skillnader innan du flyttar en arbetsbelastning från msodbcsql18.
| Issue | Details | Workaround |
|---|---|---|
| Microsoft Entra-integrerad autentisering |
Authentication=ActiveDirectoryIntegrated stöds inte. Windows authentication (Trusted_Connection=Yes) påverkas inte. |
Använd en annan Microsoft Entra-metod, eller behåll msodbcsql18. |
| Microsoft Entra-lösenordsautentisering |
Authentication=ActiveDirectoryPassword stöds inte, och stöd är inte planerat eftersom denna metod inte kan uppfylla MFA. SQL-autentisering (UID / PWD) påverkas inte. |
Använd en annan Microsoft Entra-metod, såsom en service principal, hanterad identitet eller åtkomsttoken. |
attrs_before inställningar |
Autentisering, applikationsavsikt och multi-subnet failover kan inte sättas som numeriska attribut. Sattribut utöver frågetimeout avvisas. | Använd motsvarande nyckelord för anslutningssträngar. |
| Tidsgräns för anslutningsåtgärd |
set_attr(SQL_ATTR_CONNECTION_TIMEOUT, ...) accepterar och lagrar värdet, men tillämpar ingen timeout i 0.3.0. |
Använd connect(timeout=...) för inloggning och Connection.timeout för utdrag; ingen av dem är en allmän tidsgräns för anslutningsåtgärder. |
| Värdar med flera adresser |
msodbcsql18 aktiverar Transparent Network IP Resolution (TNIR) som standard; mssql-odbc stöder det inte.
mssql-python avvisar TransparentNetworkIPResolution nyckelordet connection-string med endera leverantören. Utan MultiSubnetFailover=Yes, prövas adresser en i taget, så en ouppnåelig adress kan fördröja anslutningen. Serverassisterad DNS-cache och förbättrad routing förhandlas inte. |
Ställ MultiSubnetFailover=Yes in för lyssnare för tillgänglighetsgrupper och andra värdar med flera adresser. |
| Tillfälliga DNS-fel | Om en DNS-uppslagning misslyckas faller inte drivrutinen tillbaka till den senaste lyckade adressen. (#457) | Försök ansluta igen. |
| Dataklassificering | Metadata för känslighetsklassificering är inte tillgänglig, och SQL_COPT_SS_DATACLASSIFICATION_VERSION (1400) stöds inte. |
Fråga sys.sensitivity_classifications. |
| Multitrådning | Flertrådad användning har inte validerats. | Behåll msodbcsql18 för multitrådade arbetsbelastningar. |
fork() efter att du har anslutit |
På Linux kan en process som förgrenas efter att föräldern ansluter hänga sig när den använder drivrutinen, även med en ny anslutning. Med pooling aktiverat kan den överordnade processen också hänga. (#566) | Använd spawn startmetoden och anslut inuti varje worker. |
| Avbryta en pågående instruktion | En löpande fråga/query eller hämtning kan inte avbrytas. Att stänga arrow_reader() stoppar till exempel inte en läsning som pågår i en annan tråd. |
Använd Connection.timeout för att begränsa långvariga instruktioner. |
| Olästa resultat | Att stänga en markör eller köra en annan instruktion läser och kasserar återstående resultat istället för att avbryta dem, vilket kan gå långsamt. Att stänga en markör som använde ett förberett uttryck ignorerar Connection.timeout och kan hänga om servern slutar svara. (#546) |
Hämta bara de rader du behöver, till exempel med TOP. |
Stora värden xml och UDT-parametrar |
Värden som är bundna som SQL_SS_XML eller SQL_SS_UDT genom setinputsizes() buffras i minnet i stället för att strömmas. |
Binda xml värden som vanliga strängar. |
Tomma image värden |
Ett tomt, icke-NULL SQL Server-värde image returneras som None istället för b"". |
Läs CAST(image_column AS varbinary(max)), eller använd msodbcsql18 när skillnaden mellan tomt och NULL är viktig. |
| Icke-Unicode-strängparametrar | Strängar som är bundna som char / varchar till setinputsizes() kan kodas felaktigt för kodsidor 437, kodsida 850 och UTF-8-sorteringsordningar. |
Använd standardbindningen för strängar. |
| Äldre kodbladsavkodning på Windows | Med setdecoding(SQL_CHAR, encoding="cp1252") eller en annan äldre kodsida kan text avkodas felaktigt eller returneras som char, eftersom drivrutinen returnerar / varcharbytes data som UTF-8. |
Använd standardinställningen: conn.setdecoding(mssql_python.SQL_CHAR). |
Connection.getinfo() |
SQL_USER_NAME returnerar anslutningssträngen UID, inte databasanvändaren. Den är tom när inget UID når drivrutinen. Vissa kapabilitetsvärden och paketstorleksbaserade gränser skiljer sig från msodbcsql18. |
Använd SELECT USER_NAME() för databasanvändaren. |
| Slut på minne-fel | Vissa misslyckanden med drivrutinsallokering avslutar Python-processen istället för att utlösa MemoryError. (#484) |
Begränsa storleken på värden du skickar och hämtar. |
| Läsprestanda för stora värden | I ett benchmark var chunked reads av varchar(max) / nvarchar(max) data något långsammare än med msodbcsql18. (#473) |
Utvärdera din arbetsbelastning. |
Den här listan är inte uttömmande.
Rapporteringsproblem
Om du stöter på en bugg, välj msodbcsql18, starta om förfarandet och kontrollera om beteendet fortfarande uppstår. Ta också bort alla motstridiga leverantörstilldelningar på Python-sidan. Jämförelsen hjälper till att isolera problemet; det bevisar inte i sig orsaken. Inkludera utdata från mssql_python.get_native_provider_info(), din plattform och den felande SQL-satsen eller felmeddelandet:
- Rust-drivrutinsproblem: https://github.com/microsoft/mssql-rs/issues
-
mssql-pythonÄrenden: https://github.com/microsoft/mssql-python/issues
För Rust-driverdiagnostik, ställ in dessa variabler innan du startar Python och återskapa problemet med mssql-odbc markerat. Till exempel i PowerShell:
$env:MSSQL_TDS_TRACE = "true"
$env:MSSQL_TDS_TRACE_LEVEL = "warn,mssqlodbc=debug"
$env:MSSQL_TDS_TRACE_DIR = "./traces"
MSSQL_TDS_TRACE Möjliggör spårning, MSSQL_TDS_TRACE_LEVEL väljer loggfiltret och MSSQL_TDS_TRACE_DIR skriver filer per process istället för STDERR.
Starta om Python efter att ha ändrat dessa inställningar. Traces kan innehålla SQL-text och parametervärden. Granska och maskera känsliga uppgifter innan relevanta utdrag delas, och inaktivera spårning efter diagnos.