Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
mssql-python laadt een van de twee native ODBC-providers:
| Provider | Wat het is | Status |
|---|---|---|
msodbcsql18 |
Microsoft ODBC Driver 18 voor SQL Server, de gevestigde C++-driver | Standaard, ongewijzigd |
mssql-odbc |
Een nieuwe ODBC-driver geschreven in Rust | Preview, opt-in |
Dit artikel behandelt mssql-odbc0.3.0, de versie die momenteel door mssql-python wordt gebruikt, en wat verschilt van msodbcsql18.
Note
mssql-odbc is actief in ontwikkeling en validatie. Het is nog geen volledige vervanging van Microsoft ODBC Driver 18. Houd msodbcsql18 voorlopig als productiestandaard. Het ontwikkelingsteam is van plan de gaps in de preview in aankomende releases te dichten, behalve voor opzettelijke uitsluitingen die expliciet in dit artikel worden genoemd.
Availability
De driver wordt geleverd in het mssql-python-rs pakket als voorgecompileerde wheels voor CPython 3.10 en later:
| Platform | Architectures |
|---|---|
| Windows | x64; ARM64 op CPython 3.11+ |
| macOS | Universal2 (x86_64 + arm64), macOS 15 of later |
| Linux (glibc) | x86_64, aarch64 — manylinux_2_28 en manylinux_2_34 |
| Linux (musl) | x86_64, aarch64 — musllinux_1_2 |
Het inschakelen van het stuurprogramma
Het mssql-python pakket hangt af van mssql-python-rs, dus een normale installatie brengt de Rust-driver mee:
pip install mssql-python
Als je installeert met --no-deps of vanuit een privé-index, installeer mssql-python-rs dan expliciet ook.
Selecteer de provider vóór de eerste verbinding, of met een omgevingsvariabele:
Powershell:
$env:MSSQL_PYTHON_NATIVE_PROVIDER = "mssql-odbc"
Bash of Zsh:
export MSSQL_PYTHON_NATIVE_PROVIDER=mssql-odbc
of van Python:
import mssql_python
mssql_python.native_provider = "mssql-odbc"
Maak verbinding met de bestaande verbindingsreeks van je applicatie. Houd certificaatvalidatie ingeschakeld (Encrypt=yes;TrustServerCertificate=no). Voor authenticatie en certificaatconfiguratie, zie Verbindingsstrings en Versleuteling en certificaten.
connection = mssql_python.connect(connection_string)
Het stuurprogramma past deze regels toe bij het kiezen van de aanbieder:
- De
MSSQL_PYTHON_NATIVE_PROVIDERomgevingsvariabele heeft voorrang bovennative_provider. Een conflicterende attribuuttoewijzing genereertRuntimeWarning. - De selectie wordt vastgesteld na validatie van de verbindingsreeks en direct voordat de native verbinding wordt opgebouwd. Een latere verbindingsfout wist de selectie niet. Een eerdere fout bij het parseren van verbindingsreeksen of een ontbrekend providerpakket corrigeert de selectie niet. Nadat de selectie is vastgesteld, heeft het wijzigen van
native_providernaar een andere provider geen effect en veroorzaakt ditRuntimeWarning. Start het proces opnieuw om van provider te wisselen. - Een niet-erkende providernaam veroorzaakt een fout
ValueError; de driver valt niet terug op de standaardprovider. Een onbekende naam toegewezen aannative_providerleidt onmiddellijk tot een fout. Een onbekende naam in de omgevingsvariabele veroorzaakt een fout wanneer je probeert verbinding te maken. - Zet
native_provideropNoneom de attribuutselectie te wissen voordat deze vastligt. De omgevingsvariabele heeft nog steeds voorrang.
Bel mssql_python.get_native_provider_info() om de geselecteerde aanbieder, selectiebron en of de selectie vast is te inspecteren. Voordat je verbinding maakt, meldt dit de selectie, niet het bewijs dat de native driver succesvol is geladen.
Om terug te gaan, zet je de variabele op msodbcsql18, of maak je deze oningesteld en verwijder je elke native_provider toewijzing uit je code (of zet je hem op "msodbcsql18").
Start het proces daarna opnieuw.
Wat vandaag werkt
De mssql-odbc driver implementeert elke ODBC-functie die mssql-python aanroept, zodat de meeste applicaties van provider kunnen wisselen zonder codewijzigingen. Raadpleeg Bekende problemen voor de resterende verschillen.
| Area | Notes |
|---|---|
| Levenscyclus van de verbinding | Verbinden, close(), with blokken, inlogtimeout, diagnostiek en het wijzigen van de huidige database. Instellingen voor verbindingsstrings zijn onder andere ApplicationIntent, MultiSubnetFailover, IpAddressPreference, PacketSize, KeepAlive, en ConnectRetryCount / ConnectRetryInterval (idle-verbindingsveerkracht). |
| Authentication | SQL-authenticatie (UID / PWD); Windows authentication (Trusted_Connection=Yes, met SSPI op Windows of Kerberos op Linux en macOS); en Microsoft Entra interactief, apparaatcode, service principal, beheerde identiteit, standaardinloggegevens en toegangstoken. Geïntegreerde Entra- en wachtwoordauthenticatie worden niet ondersteund; zie Bekende problemen. |
| TLS |
Encrypt, TrustServerCertificate, HostnameInCertificate en ServerCertificate. |
| Query uitvoeren | Directe en voorbereide uitvoering, hergebruik van voorbereide plannen, qmark parameters en de conversie die pyformatmssql-python uitvoert. |
| ODBC-escape-syntaxis | Functie-, datum/tijd-, outer-join-, GUID-, LIKE ... {escape ...}-interval- en {encrypt ...}-escapereeksen. |
| opgeslagen procedures | Roep ze aan met T-SQL of positionele {call ...} syntaxis via execute(), lees resultaatsets en ga verder met nextset(). |
| Invoerparameters | Scalaire parameters, SQL NULL, setinputsizes(), en gemengde reguliere/gestreamde parameters. |
| Lange parameters | Grote tekst- en binaire parameters stromen naar de server via het gewone bindingspad; XML- en UDT-parameterbeperkingen worden hieronder vermeld. |
executemany() |
Gebatcht met ODBC-parameterarrays. Rijen met gestreamde waarden vallen terug op rij-voor-rij-uitvoering. |
| Rij ophalen |
fetchone(), fetchmany(), fetchall(), iteratie, fetchval(), getypte conversie en grote tekst-/binaire streaming. |
| Pijl ophalen |
arrow_batch(), arrow() en arrow_reader(). Vereist pyarrow. |
| Meerdere resultaatsets |
nextset(), inclusief resultaten geproduceerd door parameterarrays. |
| Transactions | Autocommit, commit, rollback, de automatische commit (of rollback, als een fout is doorgeglipt) die optreedt wanneer een with connect(...) block eindigt, en de read-uncommitted, read-committed, repeatable-read, serializable en snapshot isolatieniveaus. |
| Querytime-out | Stel Connection.timeout (in seconden) in om statements te begrenzen die door de cursors van die verbinding worden uitgevoerd; het verlopen ervan veroorzaakt OperationalError.
0 betekent geen time-out. Deze instelling staat los van de logintimeout die als connect(timeout=...)wordt doorgegeven. |
| Groepsgewijze verbindingen | De ingebouwde mssql-python pool, inclusief reset van verbindingen bij het ophalen uit de pool en aparte pools per Microsoft Entra-identiteit. |
| Metagegevens-API's |
tables(), columns(), primaryKeys(), foreignKeys(), statistics(), rowIdColumns(), rowVerColumns(), procedures(), en getTypeInfo(). |
| Encoding en converters | Standaard wide-character-codering en uitvoeromzetters. Aangepaste smalkarakterdecodering en niet-Unicode-parameterconversie hebben beperkingen vermeld in Bekende problemen. |
Gegevenstypen
Je kunt alle SQL Server-datatypes lezen, en de driver ondersteunt elk parametertype dat mssql-python bindt. De driver retourneert xml, str en json-waarden als vector (geometry als een JSON-array), en CLR-types zoals geography, hierarchyid en bytes als vector. Voor andere Python-mappings, zie Toewijzingen van gegevenstypen.
Zie Bekende problemen voor typespecifieke beperkingen.
Bekende problemen
Controleer deze verschillen voordat je een werklast verplaatst van msodbcsql18.
| Issue | Details | Workaround |
|---|---|---|
| Geïntegreerde Microsoft Entra-verificatie |
Authentication=ActiveDirectoryIntegrated wordt niet ondersteund. Windows authentication (Trusted_Connection=Yes) wordt niet beïnvloed. |
Gebruik een andere Microsoft Entra-methode, of houd msodbcsql18. |
| Wachtwoordverificatie voor Microsoft Entra |
Authentication=ActiveDirectoryPassword wordt niet ondersteund, en ondersteuning is ook niet gepland omdat deze methode niet aan MFA kan voldoen. SQL-authenticatie (UID / PWD) wordt niet beïnvloed. |
Gebruik een andere Microsoft Entra-methode, zoals een service principal, managed identity of access token. |
attrs_before instellingen |
Authenticatie, applicatieintentie en multi-subnet failover kunnen niet als numerieke attributen worden ingesteld. Statement-attributen anders dan query-timeout worden geweigerd. | Gebruik de equivalente trefwoorden voor de verbindingsreeks. |
| Time-out bij verbindingsbewerking |
set_attr(SQL_ATTR_CONNECTION_TIMEOUT, ...) accepteert en slaat de waarde op, maar het handhaaft geen timeout in 0.3.0. |
Gebruik connect(timeout=...) voor login en Connection.timeout voor statements; geen van beide is een algemene deadline voor verbinding-operaties. |
| Hosts met meerdere adressen |
msodbcsql18 schakelt standaard Transparent Network IP Resolution (TNIR) in; mssql-odbc ondersteunt het niet.
mssql-python wijst het TransparentNetworkIPResolution-trefwoord in de verbindingsreeks af bij een van beide providers. Zonder MultiSubnetFailover=Yes, worden adressen één voor één geprobeerd, dus een onbereikbaar adres kan de verbinding vertragen. Server-ondersteunde DNS-caching en verbeterde routering worden niet overeengekomen. |
Stel MultiSubnetFailover=Yes in voor beschikbaarheidsgroepluisteraars en andere hosts met meerdere adressen. |
| Tijdelijke DNS-storingen | Als een DNS-zoekopdracht faalt, valt de driver niet terug naar het laatst succesvolle adres. (#457) | Voer de verbinding opnieuw uit. |
| Gegevensclassificatie | Metadata voor gevoeligheidsclassificatie is niet beschikbaar en SQL_COPT_SS_DATACLASSIFICATION_VERSION (1400) wordt niet ondersteund. |
Query sys.sensitivity_classifications. |
| Multithreading | Gebruik met meerdere threads is nog niet gevalideerd. | Gebruik msodbcsql18 voor multithreaded workloads. |
fork() na het verbinden |
Op Linux kan een proces dat wordt geforkt nadat het bovenliggende proces verbinding heeft gemaakt vastlopen wanneer het de driver gebruikt, zelfs bij een nieuwe verbinding. Met pooling ingeschakeld kan het bovenliggende proces ook hangen. (#566) | Gebruik de spawn startmethode en maak binnen elke worker verbinding. |
| Het annuleren van een actieve statement | Een lopende query of fetch kan niet worden onderbroken. Bijvoorbeeld, het sluiten van een arrow_reader() stopt een lopende leesbewerking op een andere thread niet. |
Gebruik Connection.timeout om langlopende statements te beperken. |
| Ongelezen resultaten | Het sluiten van een cursor of het uitvoeren van een andere instructie leest en negeert de resterende resultaten in plaats van ze te annuleren, wat traag kan zijn. Het sluiten van een cursor die een voorbereide instructie gebruikt, negeert Connection.timeout en kan vastlopen als de server stopt met reageren. (#546) |
Haal alleen de rijen die je nodig hebt, bijvoorbeeld met TOP. |
Large xml en UDT-parameters |
Waarden die als SQL_SS_XML of SQL_SS_UDT door setinputsizes() worden gebonden, worden in het geheugen gebufferd in plaats van gestreamd. |
Bind xml waarden als gewone tekenreeksen. |
Lege image waarden |
Een lege, niet-NULL SQL Server-waarde image wordt teruggegeven als None in plaats van b"". |
Lees CAST(image_column AS varbinary(max)), of gebruik msodbcsql18 wanneer het onderscheid tussen leeg en NULL belangrijk is. |
| Niet-Unicode-tekenreeksparameters | Tekenreeksen die aan char / varchar tot en met setinputsizes() zijn gebonden, kunnen verkeerd worden gecodeerd voor codepagina 437, codepagina 850 en UTF-8-collaties. |
Gebruik de standaard stringbinding. |
| Legacy codepagina-decodering op Windows | Met setdecoding(SQL_CHAR, encoding="cp1252") of een andere legacy-codepage kan tekst verkeerd worden gedecodeerd of worden teruggegeven als bytes, omdat de driver gegevens char / varchar als UTF-8 teruggeeft. |
Gebruik de standaard: conn.setdecoding(mssql_python.SQL_CHAR). |
Connection.getinfo() |
SQL_USER_NAME geeft de verbindingsstring UID, niet de databasegebruiker. Het is leeg wanneer geen UID de driver bereikt. Sommige capaciteitswaarden en pakketgrootte-gebaseerde limieten verschillen van msodbcsql18. |
Gebruik SELECT USER_NAME() voor de databasegebruiker. |
| Geheugentekortfouten | Sommige driverallocatiefouten beëindigen het Python-proces in plaats van MemoryError op te werpen. (#484) |
Beperk de grootte van de waarden die je stuurt en ophaalt. |
| Leesprestaties voor grote waarden | In één benchmark waren de reads in chunks van varchar(max) / nvarchar(max) data iets langzamer dan met msodbcsql18. (#473) |
Meet je werklast. |
Deze lijst is niet volledig.
Problemen melden
Als je een bug tegenkomt, selecteer msodbcsql18dan , herstart het proces en controleer of het gedrag nog steeds voorkomt. Verwijder ook elke conflicterende provider-toewijzing aan de Python-zijde. De vergelijking helpt het probleem te isoleren; het bewijst op zichzelf de oorzaak niet. Voeg de output van mssql_python.get_native_provider_info(), je platform en de mislukte SQL-query of foutmelding toe:
- Problemen met Rust-stuurprogramma's: https://github.com/microsoft/mssql-rs/issues
-
mssql-pythonProblemen: https://github.com/microsoft/mssql-python/issues
Voor Rust-driver diagnostiek stel je deze variabelen in voordat je Python start en reproduceer je het probleem met mssql-odbc geselecteerd. Bijvoorbeeld in PowerShell:
$env:MSSQL_TDS_TRACE = "true"
$env:MSSQL_TDS_TRACE_LEVEL = "warn,mssqlodbc=debug"
$env:MSSQL_TDS_TRACE_DIR = "./traces"
MSSQL_TDS_TRACE Maakt traceren mogelijk, MSSQL_TDS_TRACE_LEVEL selecteert het logfilter en MSSQL_TDS_TRACE_DIR schrijft per-procesbestanden in plaats van STDERR.
Herstart Python nadat je deze instellingen hebt gewijzigd. Traces kunnen SQL-tekst en parameterwaarden bevatten. Beoordeel en lak gevoelige gegevens weg voordat relevante fragmenten worden gedeeld, en schakel tracering uit na de diagnose.