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

Nutzen Sie dieses Beispiel als Ausgangspunkt für eine produktionsorientierte Azure SQL-Verbindung. Es liest Konfigurationen aus der Umgebung, authentifiziert sich mit verwalteter Identität und aktiviert die Verschlüsselung des Tabular Data Stream (TDS) 8.0. Außerdem setzt es Timeouts für die Anmeldung und für einzelne Abfragen, wiederholt bei vorübergehenden Fehlern den Versuch mit exponentiell ansteigenden Wartezeiten (bei Verbindungsfehlern mit einer neuen Verbindung, bei Abfragefehlern wie Deadlocks mit derselben Verbindung), protokolliert die Ergebnisse und nutzt Kontextmanager, um Ressourcen freizugeben.

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.

import logging
import os
import time

import mssql_python

logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s %(levelname)s %(name)s %(message)s",
)
logger = logging.getLogger("app")

# Transient errors that require a fresh connection to recover.
CONNECT_RETRY_ERRORS = frozenset({
    "Timeout expired",
    "Connection timeout expired",
    "Client unable to establish connection",
    "Communication link failure",
    "Connection failure during transaction",
})

# Transient errors that leave the connection usable, such as a deadlock victim
# or a query timeout, so retry on the same connection.
QUERY_RETRY_ERRORS = frozenset({
    "Serialization failure",
    "Timeout expired",
})


def connect_with_retry(conn_str: str, max_attempts: int = 3, login_timeout_s: int = 5) -> mssql_python.Connection:
    """Open a connection, retrying transient failures with exponential backoff."""
    for attempt in range(1, max_attempts + 1):
        try:
            conn = mssql_python.connect(
                conn_str,
                attrs_before={mssql_python.SQL_ATTR_LOGIN_TIMEOUT: login_timeout_s},
            )
            logger.info("connected on attempt %d/%d", attempt, max_attempts)
            return conn
        except mssql_python.OperationalError as exc:
            if exc.driver_error not in CONNECT_RETRY_ERRORS or attempt == max_attempts:
                logger.error("connect failed on attempt %d/%d: %s", attempt, max_attempts, exc.driver_error)
                raise
            delay = 2 ** (attempt - 1)  # 1s, 2s, 4s
            logger.warning(
                "connect attempt %d/%d hit transient error %r; retrying in %ds",
                attempt, max_attempts, exc.driver_error, delay,
            )
            time.sleep(delay)


def execute_with_retry(
    conn: mssql_python.Connection,
    sql: str,
    *params,
    max_attempts: int = 3,
    query_timeout_s: int = 10,
) -> mssql_python.Cursor:
    """Run sql on an open connection and return the ready-to-fetch cursor.

    Retries errors that leave the connection usable so callers don't wrap each
    query in its own function. Pass query values as parameters. Retry only
    idempotent statements; wrap writes in an explicit transaction.
    """
    for attempt in range(1, max_attempts + 1):
        cursor = mssql_python.Cursor(conn, timeout=query_timeout_s)
        try:
            cursor.execute(sql, *params)
            if attempt > 1:
                logger.info("query succeeded on attempt %d/%d", attempt, max_attempts)
            return cursor
        except mssql_python.OperationalError as exc:
            cursor.close()
            if exc.driver_error not in QUERY_RETRY_ERRORS or attempt == max_attempts:
                logger.error("query failed on attempt %d/%d: %s", attempt, max_attempts, exc.driver_error)
                raise
            delay = 2 ** (attempt - 1)  # 1s, 2s, 4s
            logger.warning(
                "query attempt %d/%d hit transient error %r; retrying in %ds",
                attempt, max_attempts, exc.driver_error, delay,
            )
            time.sleep(delay)
    raise RuntimeError("unreachable: the retry loop exits by return or raise")


def main() -> None:
    # Read configuration from the environment; never hard-code secrets.
    server = os.environ["SQL_SERVER"]      # for example, myserver.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;"
    )
    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:
        # Context managers close the cursor and connection automatically.
        with connect_with_retry(conn_str) as conn:
            with execute_with_retry(conn, query) as cursor:
                for business_entity_id, first_name, last_name in cursor.fetchall():
                    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
Verbindungszeichenfolgen Syntax von Verbindungsstrings, häufige Schlüsselwörter und Beispiele.
Erstellen Sie Verbindungsstrings programmatisch Erstellen Sie Verbindungszeichenfolgen sicher aus Konfiguration und Geheimwerten.
Verbindungsverwaltung Öffnen, wiederverwenden und schließen Sie die Verbindungen sauber.
Verbindungspooling Pool-Tuning, 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 Ergebnismengen.
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, Speicherpunkte und Isolationslevel.
Seitennummerierung Keyset- und Offset-Paginierungsmuster für große Ergebnismengen.
Fehlerbehandlung mssql_python.Error, DatabaseError, und SQL Server-Fehlerstruktur.
Wiederholungslogik Erkenne vorübergehende Fehler und versuche es erneut 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, Kollationen und Codepages.
NULL-Handhabung Dreiwertige Logik, Sentinels und Interoperabilität mit pandas.
Binärdaten varbinary, image und das Streamen großer Objekte.
Benutzerdefinierte Typkonverter Registrieren Sie Eingabe- und Ausgabekonverter für benutzerdefinierte Typen.
Massenkopieroperationen Hochdurchsatz-Inserts mit 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.
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 Cursorzugriff, Pfeilextraktion, pandas, Polars und DuckDB-Analysen statt SQL-Daten.
Datenlade- und Bewegungsmuster Wählen Sie den richtigen Schreibpfad für das Einfügen von Zeilen, Massenkopieren, MERGE Upserts, das Laden von DataFrames und die CSV-Erfassung.

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-Tuning, vorbereitete Anweisungen, Chargengrößen und Massenkopien.
Problembehandlung Häufige Fehler, Protokollierung und Zertifikatsdiagnostik.
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.

Referenz

Artikel Beschreibung
Supportlebenszyklus Unterstützte Python- und SQL Server-Versionen sowie Update-Rhythmus.
Neuerungen Versionsverlauf und Versionshighlights.