Microsoft Python-Treiber für SQL Server – mssql-python

mssql-python ist der Python-Treiber von Microsoft für SQL Server, Azure SQL-Datenbank, Azure SQL Managed Instance und SQL-Datenbank in Microsoft Fabric. Es verwendet Direct Database Connectivity (DDBC), sodass du dich verbinden kannst, ohne einen externen Treibermanager zu installieren. Der Treiber unterstützt Python 3.10 oder neuer, entspricht der Python Database API Specification 2.0 und fügt Python-freundliche Verbesserungen für die tägliche Entwicklung hinzu.

Auswählen des Startpunkts

Produktionsbasisplan für Azure SQL

Dieses Beispiel verbindet sich mit Azure SQL mit verwalteter Identität und Tabular Data Stream (TDS) 8.0-Verschlüsselung. Es liest die Verbindungseinstellungen aus Umgebungsvariablen und legt separate Anmelde- und Abfragezeitlimits fest. Jeder erneute Versuch ruft connect() erneut auf, anstatt ein fehlgeschlagenes Verbindungsobjekt wiederzuverwenden. Context Manager geben die Verbindung und den Cursor nach jedem Versuch frei.

Verwenden Sie diesen Helfer nur für idempotente Leseanfragen, die sicher wiederholt werden können. Nutze es nicht, um einzelne Schreibvorgänge oder teilweise abgeschlossene Transaktionen erneut abzuspielen.

Die Schlüsselwörter ConnectRetryCount und ConnectRetryInterval in der Verbindungszeichenfolge aktivieren die SQL Server-Leerlaufverbindungsresilienz: Der Treiber stellt eine getrennte Leerlaufverbindung transparent wieder her. Das unterscheidet sich vom Anwendungs-Level-Retry in diesem Beispiel, bei dem eine Abfrage erneut ausprobiert wird, die mit einem vorübergehenden Fehler wie einem Deadlock oder Query-Timeout fehlschlägt. Die beiden ergänzen sich, also behalte beide.

Die Azure-Fehlerprüfung stimmt mit der Standard-englischen Fehlermeldung 40501 überein, selbst wenn die Diagnose die Fehlernummer weglässt. Es prüft ddbc_error auch auf bekannte Zahlen, wenn vorhanden. Matching ist Best-Effort: Lokalisierte oder anders formatierte Nachrichten passen möglicherweise nicht überein. Weitere Informationen finden Sie unter Vorübergehende Verbindungsfehler.

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()

Für ausführlichere Hinweise zu jedem Thema in diesem Beispiel siehe Microsoft Entra Authentifizierung, Connection Pooling, Verschlüsselung und Zertifikate, Retry-Logik und Fehlerbehandlung.

Wichtigste Funktionen

Loslegen

Artikel Beschreibung
Installation Installiere mssql-python und verifiziere deine Python-Umgebung.
Quickstart: Verbinden Sie sich mit mssql-python Verbinden Sie sich mit einer lokalen oder Test-SQL Server-Instanz und führen Sie Ihre erste Abfrage aus.
Quickstart: Verbinden Sie sich über ein Jupyter Notebook Verwenden Sie mssql-python in einem Notizbuch für interaktive Datenerkundung.
Schnellstart: Massenkopieren Trage große Datensätze mit der Bulk-Copy-API in den SQL Server ein.
Quickstart: Schnellprototyping Erstellen Sie schnell kleine Skripte und Konzeptnachweise.
Schnellstart: Wiederholbare Bereitstellungen Python-Anwendungen paketieren, konfigurieren und bereitstellen, die mit SQL arbeiten.
Apache Arrow Quickstart Rufen Sie Abfrageergebnisse als Apache-Pfeil-Tabellen für Analyse-Workflows ab.

Konfigurieren und authentifizieren

Artikel Beschreibung
mssql-odbc-Anbieter (Vorschau) Wählen Sie den nativen Anbieter in der Vorschau und überprüfen Sie unterstützte Funktionen sowie bekannte Probleme.
Verbindungszeichenfolgen Syntax von Verbindungsstrings, häufige Schlüsselwörter und Beispiele.
Erstellen Sie Verbindungsstrings programmatisch Erstellen Sie Verbindungszeichenfolgen sicher aus Konfiguration und Geheimnissen.
Verbindungsverwaltung Öffnen, wiederverwenden und schließen Sie Verbindungen ordnungsgemäß.
Pooling von Verbindungen Pool-Optimierung, Lebensdauern und Wiederverwendungsmuster.
Verschlüsselung und Zertifikate TLS-Verschlüsselungsmodi, Zertifikatsvalidierung und TDS 8.0.
Microsoft Entra-Authentifizierung Passwortlose Authentifizierung für Azure SQL mit verwalteten Identitäts-, Service-Principal-, interaktiven und Gerätecode-Flüssen.
Bewährte Methoden für Sicherheit Parametrisierung, geheime Verwaltung, geringste Berechtigungen und Verschlüsselung.
Verfügbarkeitsgruppen Verbinden Sie sich mit Always On-Verfügbarkeitsgruppen und schreibgeschützten Replikaten.

Mit Daten arbeiten

Artikel Beschreibung
Abfragen ausführen execute, executemany, Batches mit mehreren Anweisungen und Resultsets.
Datenabruf fetchone, fetchmany, fetchall und Streamingmuster.
Parametrisierte Abfragen Binde Parameter sicher, um SQL-Injection zu verhindern.
Gespeicherten Prozeduren Prozeduren aufrufen, Ausgabeparameter lesen und Ergebnismengen verarbeiten.
Cursorverwaltung Cursor-Lebensdauern, Scrollen und Arraysize-Tuning.
Zeilenobjekte Greifen Sie per Index, Name oder als Mapping auf Zeilen zu.
Transaktionsverwaltung Commit, Rollback, Savepoints und Isolationsstufen.
Seitennummerierung Keyset- und Offset-Paginierungsmuster für große Ergebnismengen.
Fehlerbehandlung mssql_python.Error, DatabaseError, und SQL Server-Fehlerstruktur.
Wiederholungslogik Erkennen Sie vorübergehende Fehler und wiederholen Sie den Vorgang mit exponentiellem Backoff.

SQL Server-Datentypen und -Funktionen

Artikel Beschreibung
Datentypzuordnungen SQL Server-zu-Python-Typtabelle und Konvertierungsregeln.
Datetime-Handling datetime, datetime2, datetimeoffset und Zeitzonenaspekte.
Dezimal- und Geldtypen Exakte numerische Typen und decimal.DecimalGenauigkeit.
String- und Unicode-Daten varchar, nvarchar, Sortierreihenfolgen und Codeseiten.
NULL-Handhabung Dreipolige Logik, Sentinel-Werte und Pandas-Interoperabilität.
Binärdaten varbinary, image und das Streamen großer Objekte.
Benutzerdefinierte Typkonverter Registrieren Sie Eingabe- und Ausgabekonverter für benutzerdefinierte Typen.
Massenkopieroperationen Einfügungen mit hohem Durchsatz mithilfe der Bulk-Copy-API.
JSON-Daten Speichern, Abfrage und Zerkleinern JSON mit FOR JSON und OPENJSON.
XML-Daten Arbeiten Sie mit dem xml Datentyp, XPath und XQuery.
Räumliche Daten geometry und geography Typen aus Python.
Spärliche Spalten Sparse Spalten und Spaltensätze für breite Tabellen.
Schema Ermittlung Überprüfen Sie Datenbanken, Tabellen, Spalten und Indexe.

Integration mit Python-Tools und Frameworks

Artikel Beschreibung
Apache-Pfeil-Integration Rufe die Ergebnisse als Arrow-Tabellen für Zero-Copy-Analysen ab.
PANDAS-Integration Lade Abfrageergebnisse in DataFrames und schreibe sie zurück.
Polars-Integration Verwende Polars mit mssql-python für columnarische Workloads.
DuckDB-Integration Abfrage von SQL Server-Daten zusammen mit lokalen DuckDB-Tabellen.
FastAPI-Integration Integriere mssql-python in FastAPI-Dienste.
Teste und setze FastAPI-Anwendungen bereit Konfigurieren Sie Pooling, Fehler, Authentifizierung, Tests und Bereitstellungseinstellungen für FastAPI-Dienste.
Flask-Integration Verwenden Sie mssql-python in Flask-Anwendungen.
Asynkrone Muster Kombinieren Sie mssql-python mit asyncio und Thread-Pools.
Datenzugriffs- und Analysemuster Wählen Sie den richtigen Lesepfad für den Cursor-Zugriff, die Arrow-Extraktion, Pandas, Polars und DuckDB-Analytics über SQL-Daten.
Datenlade- und Bewegungsmuster Wählen Sie den richtigen Schreibpfad für Zeileneinfügungen, Bulk-Copy, MERGE Upserts, das Laden von DataFrames und die CSV-Einbindung.

Bereitstellen und Betreiben

Artikel Beschreibung
Container und lokale Entwicklung Richte Docker-Container, Devcontainer und CI-Pipelines für Python-Anwendungen ein, die mit SQL verbunden sind.
Leistungsoptimierung Pool-Optimierung, vorbereitete Anweisungen, Batch-Größen und Bulk-Copy.
Problembehandlung Finden Sie Orientierung anhand von Symptomen oder Fehlermeldungen.
Installation und Verbindung, Fehlerbehebung Lösen Sie Probleme bei Installation, Verbindung, Container und CI.
Abfrage-, Daten- und Betriebsfehlersuche Probleme mit Abfragen, Datentypen, der Leistung, Transaktionen und Massenkopiervorgängen beheben.
Modulkonfiguration Modulebene-Einstellungen, Logging-Hooks und Feature-Flags.

Migration zu mssql-python

Artikel Beschreibung
Von pyodbc migrieren Ordnen Sie pyodbc-APIs und Verbindungszeichenfolgen mssql-python zu.
Migration von pymssql Ersetze pymssql durch mssql-python, während das Verhalten erhalten bleibt.
Migration von SQLite Verschiebe lokale SQLite-Workloads auf SQL Server oder Azure SQL.
Migrieren von PostgreSQL Ein One-Stop-Guide für Python-Entwickler, die von PostgreSQL zu SQL Server mit mssql-python wechseln.

Anfordern eines Features

Um eine Funktion anzufordern, öffne ein Problem im mssql-python GitHub-Repository.