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 is het Python-stuurprogramma van Microsoft voor SQL Server, Azure SQL Database, Azure SQL Managed Instance en de SQL-database in Microsoft Fabric. Het gebruikt Direct Database Connectivity (DDBC), zodat je kunt verbinden zonder een externe driver manager te installeren. De driver ondersteunt Python 3.10 of later en voldoet aan de Python Database API Specification 2.0, terwijl er Python-vriendelijke verbeteringen worden toegevoegd voor dagelijkse ontwikkeling.
Uw beginpunt kiezen
- Om verbinding te maken met SQL Server, Azure SQL Database of SQL-database in Microsoft Fabric en je eerste query uit te voeren, start je met Quickstart: Maak verbinding met de mssql-python-driver.
- Om een lokale SQL Server-container te maken, begin je met Container en lokale ontwikkeling.
- Om verbinding te maken met Azure SQL met wachtwoordloze authenticatie, begin je met Microsoft Entra-authenticatie- en Connection-strings.
- Om data interactief te verkennen, begin je met Verbinden vanuit een Jupyter-notebook of Snel prototypen.
- Om grote hoeveelheden data efficiënt te verplaatsen, ga je naar Bulk copy operations of de Bulk copy quickstart.
- Om te migreren van een andere driver, ga je naar Migreren van pyodbc, Migreren van pymssql, migreren van SQLite, of migreren vanaf PostgreSQL.
Productiebasislijn voor Azure SQL
Dit voorbeeld maakt verbinding met Azure SQL met beheerde identiteit en Tabular Data Stream (TDS) 8.0-encryptie. Het leest verbindingsinstellingen uit omgevingsvariabelen en stelt aparte inlog- en query-timeouts in. Elke herpoging roept connect() opnieuw aan in plaats van een mislukt verbindingsobject opnieuw te gebruiken. contextmanagers geven de verbinding en cursor na elke poging vrij.
Gebruik deze helper alleen voor idempotente leeszoekopdrachten die veilig herhaald kunnen worden. Gebruik het niet om individuele schrijfopdrachten of gedeeltelijk voltooide transacties opnieuw af te spelen.
De ConnectRetryCount en ConnectRetryInterval trefwoorden in de verbindingsreeks maken de veerkracht van de idle-verbinding van SQL Server mogelijk: de driver maakt transparant opnieuw verbinding met een verbroken idle-verbinding. Dat verschilt van de herhalingspoging op toepassingsniveau in dit voorbeeld, waarbij een query opnieuw wordt uitgevoerd als die mislukt door een tijdelijke fout, zoals een deadlock of een time-out van een query. De twee vullen elkaar aan, dus houd ze allebei.
De Azure-foutcontrole komt overeen met het standaard Engelse foutbericht 40501, zelfs wanneer de diagnose het foutnummer weglaat. Het controleert ddbc_error ook op bekende getallen wanneer aanwezig. Matching is best effort: gelokaliseerde of anders opgemaakte berichten komen mogelijk niet overeen. Zie Tijdelijke verbindingsfouten voor meer informatie.
import logging
import os
import re
import time
import mssql_python
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s %(levelname)s %(name)s %(message)s",
)
logger = logging.getLogger("app")
TRANSIENT_DRIVER_ERRORS = frozenset({
"Timeout expired",
"Connection timeout expired",
"Client unable to establish connection",
"Communication link failure",
"Connection failure during transaction",
"Serialization failure",
"Statement completion unknown",
})
AZURE_THROTTLING_ERRORS = frozenset({
40197, 40501, 40540, 40613, 40680, 49918, 49919, 49920, 10928, 10929,
})
_ERROR_NUMBER_RE = re.compile(r"\b(?:Error|Msg)\s+(\d+)\b")
_AZURE_40501_MESSAGE = "The service is currently busy. Retry the request after 10 seconds."
def is_azure_throttling(error: BaseException) -> bool:
"""Best-effort detection of Azure SQL throttling in ProgrammingError text."""
if not isinstance(error, mssql_python.ProgrammingError):
return False
ddbc_text = getattr(error, "ddbc_error", "") or ""
return (
_AZURE_40501_MESSAGE in ddbc_text
or any(int(m) in AZURE_THROTTLING_ERRORS for m in _ERROR_NUMBER_RE.findall(ddbc_text))
)
def query_with_retry(
conn_str: str,
sql: str,
*params,
max_attempts: int = 3,
login_timeout_s: int = 5,
query_timeout_s: int = 10,
) -> list:
"""Fetch an idempotent read query, reconnecting before each retry."""
for attempt in range(1, max_attempts + 1):
try:
with mssql_python.connect(conn_str, timeout=login_timeout_s) as conn:
conn.timeout = query_timeout_s
with conn.cursor() as cursor:
cursor.execute(sql, *params)
rows = cursor.fetchall()
logger.info("query succeeded on attempt %d/%d", attempt, max_attempts)
return rows
except mssql_python.Error as exc:
azure_throttling = is_azure_throttling(exc)
transient = (
isinstance(exc, mssql_python.OperationalError)
and exc.driver_error in TRANSIENT_DRIVER_ERRORS
)
if not (transient or azure_throttling) or attempt == max_attempts:
logger.error("query failed on attempt %d/%d: %s", attempt, max_attempts, exc.driver_error)
raise
delay = (10 if azure_throttling else 1) * (2 ** (attempt - 1))
logger.warning(
"query attempt %d/%d hit transient error %r; retrying in %ds",
attempt, max_attempts, exc.driver_error, delay,
)
time.sleep(delay)
raise ValueError("max_attempts must be at least 1")
def main() -> None:
# Read configuration from the environment; never hard-code secrets.
server = os.environ["SQL_SERVER"] # for example, <server>.database.windows.net
database = os.environ["SQL_DATABASE"] # for example, AdventureWorks
client_id = os.getenv("AZURE_CLIENT_ID") # set for a user-assigned managed identity
# Authenticate with the workload's managed identity over TDS 8.0 encryption.
# ConnectRetryCount/ConnectRetryInterval transparently reconnect a dropped
# idle connection; they don't replay a failed query.
conn_str = (
f"Server={server};"
f"Database={database};"
"Authentication=ActiveDirectoryMsi;"
"Encrypt=strict;"
"ConnectRetryCount=3;"
"ConnectRetryInterval=10;"
# Parallel dials to all resolved IPs; safe on single-IP targets.
"MultiSubnetFailover=Yes;"
)
if client_id:
conn_str += f"UID={client_id};"
query = """
SELECT TOP 10
p.BusinessEntityID,
p.FirstName,
p.LastName
FROM Person.Person AS p
ORDER BY p.BusinessEntityID;
"""
try:
rows = query_with_retry(conn_str, query)
for business_entity_id, first_name, last_name in rows:
print(f"{business_entity_id}\t{first_name}\t{last_name}")
except mssql_python.Error:
logger.exception("query failed")
raise
if __name__ == "__main__":
main()
Voor diepere richtlijnen over elk probleem in dit voorbeeld, zie Microsoft Entra authenticatie, Connection pooling, Encryption and certificates, Retry logic en Error handling.
Belangrijkste kenmerken
-
PEP 249-conformiteit: standaard
connect,cursor,execute, enfetch*interfaces, plus Pythonic-extensies. -
Direct Database Connectivity (DDBC): Geen externe drivermanager vereist. Installeer
mssql-pythonhet en je bent klaar om te verbinden. - Microsoft Entra ID-authenticatie: Ingebouwde ondersteuning voor authenticatiemodi, inclusief beheerde identiteiten en servicehoofden.
- SQL Server en Windows authentication: SQL-logins, Kerberos en Windows single sign-on (SSO) op ondersteunde platforms.
- Bulkkopiëren: Bulkinvoeging met hoge prestaties voor grote gegevensladingen met ondersteuning voor het native TDS-protocol.
- Ondersteuning voor native datatypes: JSON, XML, ruimtelijk, spaarzame kolommen, datetimeoffset en decimaal/money met precieze afhandeling.
- Apache Arrow-integratie: Zero-copy resultaatsets voor snelle gegevensuitwisseling met pandas, Polars en DuckDB.
-
Async-patronen: Gebruik de driver met
asyncio-gebaseerde applicaties en FastAPI via ThreadPoolExecutor-workarounds. Zie Async-patronen voor integratiepatronen. -
TLS standaard ingeschakeld: TLS-encryptie en certificaatvalidatie staan standaard aan bij een van beide native ODBC-providers. TDS 8.0-versleuteling is beschikbaar wanneer je
Encrypt=strictinstelt.
Aan de slag
| Artikel | Beschrijving |
|---|---|
| Installation | Installeer mssql-python en verifieer je Python-omgeving. |
| Quickstart: Maak verbinding met mssql-python | Maak verbinding met een lokale of test SQL Server-instantie en voer je eerste query uit. |
| Quickstart: Verbind vanaf een Jupyter Notebook | Gebruik mssql-python in een notitieboek voor interactieve data-exploratie. |
| Snelstart: bulkkopiëren | Verplaats grote datasets naar SQL Server met de bulk copy API. |
| Quickstart: Snel prototypen | Bouw snel kleine scripts en proofs of concept. |
| Quickstart: Herhaalbare inzetten | Pak, configureer en verzend Python-applicaties die met SQL communiceren. |
| Apache Arrow quickstart | Haal queryresultaten op als Apache Arrow-tabellen voor analytics-workflows. |
Configureren en authenticeren
| Artikel | Beschrijving |
|---|---|
| mssql-odbc provider (Preview) | Selecteer de preview-native provider en bekijk de ondersteunde functies en bekende problemen. |
| Verbindingsreeksen | Verbindingsstringsyntaxis, veelvoorkomende trefwoorden en voorbeelden. |
| Bouw verbindingsstrings programmatisch | Stel verbindingsstrings veilig samen uit configuratie en geheimen. |
| Verbindingsbeheer | Open, hergebruik en sluit de verbindingen netjes. |
| Groepsgewijze verbindingen | Zwembadafstemming, levensduur- en hergebruikpatronen. |
| Encryptie en certificaten | TLS-encryptiemodi, certificaatvalidatie en TDS 8.0. |
| Microsoft Entra-authenticatie | Wachtwoordloze authenticatie voor Azure SQL met beheerde identiteits-, serviceprincipal-, interactieve en apparaatcodeflows. |
| Aanbevolen procedures voor beveiliging | Parameters, geheimenbeheer, minimale bevoegdheden en versleuteling. |
| Beschikbaarheidsgroepen | Verbind met Always On-beschikbaarheidsgroepen en replica's voor alleen-lezen. |
Werken met gegevens
| Artikel | Beschrijving |
|---|---|
| Uitvoeren van queries |
execute, executemany, batches met meerdere instructies, en resultaatsets. |
| Data ophalen |
fetchone, fetchmany, , fetchallen stroompatronen. |
| Geparameteriseerde query’s | Koppel parameters veilig om SQL-injectie te voorkomen. |
| Opgeslagen procedures | Roep procedures aan, lees uitvoerparameters en verwerk resultaatsets. |
| Cursorbeheer | De levensduur van cursors, scrollen en het afstemmen van de arraygrootte. |
| Rijobjecten | Toegang tot rijen via index, naam of als mappings. |
| Transactiebeheer | Bevestigen, terugdraaien, opslagpunten en isolatieniveaus. |
| Paginering | Keyset- en offset-pagineringspatronen voor grote resultaatsets. |
| Foutafhandeling |
mssql_python.Error, DatabaseError, en SQL Server-foutstructuur. |
| Logica voor opnieuw proberen | Detecteer tijdelijke fouten en probeer opnieuw met exponentiële backoff. |
SQL Server-gegevenstypen en -functies
| Artikel | Beschrijving |
|---|---|
| Gegevenstypetoewijzingen | Typetabel en conversieregels van SQL Server naar Python. |
| Afhandeling van datum en tijd |
datetime, datetime2, , datetimeoffseten tijdzoneoverwegingen. |
| Decimale en geldtypen | Exacte numerieke types en decimal.Decimal precisie. |
| String- en Unicode-gegevens |
varchar, nvarchar, collaties en codepagina's. |
| NULL-afhandeling | Driewaardelogica, sentinels en interoperabiliteit met pandas. |
| Binaire gegevens |
varbinary, image, en het streamen van grote objecten. |
| Aangepaste typeconverters | Registreer invoer- en uitgangsomzetters voor aangepaste types. |
| Bewerkingen voor bulkkopiëren | Invoegingen met hoge verwerkingssnelheid via de bulk copy-API. |
| JSON-gegevens | Opslaan, opvragen en versnipperen JSON met FOR JSON en OPENJSON. |
| XML-gegevens | Werk met het xml datatype, XPath en XQuery. |
| Ruimtelijke gegevens |
geometry- en geography-typen uit Python. |
| Sparse kolommen | Spaarzame kolommen en kolomsets voor brede tabellen. |
| Schemadetectie | Inspecteer databases, tabellen, kolommen en indexen. |
Integreer met Python-tools en frameworks
| Artikel | Beschrijving |
|---|---|
| Apache Arrow-integratie | Haal resultaten op als Arrow-tabellen voor zero-copy analytics. |
| Pandas-integratie | Laad queryresultaten in DataFrames en schrijf ze terug. |
| Polare integratie | Gebruik Polars met mssql-python voor kolomwerklasten. |
| DuckDB-integratie | Zoek SQL Server-gegevens samen met lokale DuckDB-tabellen. |
| FastAPI-integratie | Verbind mssql-python met FastAPI-services. |
| FastAPI-applicaties testen en uitrollen | Configureer pooling, fouten, authenticatie, tests en deployment-instellingen voor FastAPI-diensten. |
| Flask-integratie | Gebruik mssql-python in Flask-applicaties. |
| Asynchroon patronen | Combineer mssql-python met asyncio en threadpools. |
| Gegevenstoegangs- en analysepatronen | Kies het juiste leespad voor cursor-toegang, Arrow-extractie, pandas, Polars en DuckDB-analyse over SQL-data. |
| Data-laad- en bewegingspatronen | Kies de juiste schrijfmethode voor het invoegen van rijen, bulkgewijs kopiëren, MERGE upserts, het laden van DataFrames en het importeren van CSV-bestanden. |
Implementeren en gebruiken
| Artikel | Beschrijving |
|---|---|
| Container en lokale ontwikkeling | Zet Docker-containers, devcontainers en CI-pijplijnen op voor Python-applicaties die verbinding maken met SQL. |
| Performance-optimalisatie | Pooltuning, voorbereide statements, batchgroottes en bulk copy. |
| Troubleshooting | Vind begeleiding via symptoom of foutmelding. |
| Installatie- en verbindingsprobleemoplossing | Los problemen met installatie, verbinding, container en CI op. |
| Probleemoplossing voor zoekopdrachten, data en werking | Los query-, gegevenstype-, prestatie-, transactie- en bulkkopieerproblemen op. |
| Moduleconfiguratie | Instellingen op moduleniveau, loghooks en featureflags. |
Migreren naar mssql-python
| Artikel | Beschrijving |
|---|---|
| Migreren vanuit pyodbc | Wijs pyodbc-API's en verbindingsreeksen toe aan mssql-python. |
| Migreren vanuit pymssql | Vervang pymssql door mssql-python terwijl het gedrag behouden blijft. |
| Migreren vanuit SQLite | Verplaats lokale SQLite-workloads naar SQL Server of Azure SQL. |
| Migreren vanuit PostgreSQL | One-stop gids voor Python-ontwikkelaars die overstappen van PostgreSQL naar SQL Server met mssql-python. |
Verzoeken om een functie toe te voegen
Om een functie aan te vragen, open je een issue in de mssql-python GitHub-repository.