Microsoft Python-stuurprogramma voor SQL Server - mssql-python

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

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, en fetch* interfaces, plus Pythonic-extensies.
  • Direct Database Connectivity (DDBC): Geen externe drivermanager vereist. Installeer mssql-python het 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=strict instelt.

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.