Driver Microsoft Python per SQL Server - mssql-python

mssql-pythonè il driver Python di Microsoft per SQL Server, database SQL di Azure, Istanza gestita di SQL di Azure e database SQL in Microsoft Fabric. Utilizza la connettività diretta al database (DDBC), quindi puoi connetterti senza installare un gestore driver esterno. Il driver supporta Python 3.10 o successivo e rispetta la specifica API di database Python 2.0, aggiungendo miglioramenti compatibili con Python per lo sviluppo quotidiano.

Scegliere il punto di partenza

Baseline di produzione per Azure SQL

Usa questo esempio come punto di partenza per una connessione Azure SQL orientata alla produzione. Legge la configurazione dall'ambiente, si autentica con l'identità gestita e abilita la crittografia Tabular Data Stream (TDS) 8.0. Imposta inoltre timeout di accesso e timeout delle query per istruzione, ritenta i fallimenti transitori con un backoff esponenziale (una nuova connessione per gli errori di connessione, la stessa connessione per errori di query come i deadlock), registra gli esiti e si affida ai context manager per rilasciare le risorse.

Le parole chiave ConnectRetryCount e ConnectRetryInterval nella stringa di connessione consentono a SQL Server la resilienza delle connessioni inattive: il driver riconnette in modo trasparente una connessione inattiva interrotta. Questo è diverso dal nuovo tentativo a livello applicativo in questo esempio, che esegue nuovamente una query che non riesce a causa di un errore transitorio, ad esempio un deadlock o un timeout della query. I due sono complementari, quindi tieni entrambi.

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

Per indicazioni più approfondite su ciascuna problematica in questo esempio, vedi Microsoft Entra autenticazione, Connection pooling, Crittografia e certificati, Logica dei ritenti e Gestione degli errori.

Funzionalità principali

  • Conformità alla PEP 249: interfacce standard connect, cursor, execute e fetch*, oltre a estensioni pythoniche.
  • Connettività diretta al database (DDBC): Nessun gestore esterno di driver richiesto. Installa mssql-python e sei pronto per connetterti.
  • Autenticazione di Microsoft Entra ID: Supporto integrato per modalità di autenticazione, tra cui identità gestite e entità servizio.
  • SQL Server e autenticazione di Windows: login SQL, Kerberos e single sign-on (SSO) di Windows su piattaforme supportate.
  • Copia in massa: inserimento bulk ad alte prestazioni per carichi dati di grandi dimensioni con supporto nativo al protocollo TDS.
  • Supporto nativo dei tipi di dati: JSON, XML, spaziale, colonne sparse, datetimeoffset e decimale/money con gestione precisa.
  • Integrazione Apache Arrow: set di risultati senza copia per uno scambio rapido di dati con pandas, Polars e DuckDB.
  • Pattern asincroni: Utilizza il driver con applicazioni basate su asyncio e FastAPI tramite soluzioni alternative con ThreadPoolExecutor. Vedi Pattern asincroni per i pattern di integrazione.
  • TLS di default: crittografia TLS e validazione dei certificati attivati di default (tramite ODBC Driver 18). La crittografia TDS 8.0 è disponibile quando si imposta Encrypt=strict.

Inizia subito

Articolo Descrizione
Installazione Installa mssql-python e verifica il tuo ambiente Python.
Avvio rapido: Connettiti con mssql-python Connettiti a un'istanza locale o di test di SQL Server ed esegui la prima query.
Avvio rapido: Collegati da un Jupyter Notebook Usa mssql-python all'interno di un quaderno per un'esplorazione interattiva dei dati.
Avvio rapido: copia in blocco Sposta grandi set di dati in SQL Server con l'API di copia in massa.
Quickstart: prototipazione rapida Costruisci rapidamente piccoli script e proof of concept.
Quickstart: Implementazioni ripetibili Pacchettizza, configura e distribuisci applicazioni Python che interagiscono con SQL.
Avvio rapido di Apache Arrow Recupera i risultati delle query come tabelle Apache Arrow per i flussi di lavoro di analisi.

Configura e autentica

Articolo Descrizione
Stringhe di connessione Sintassi delle stringhe di connessione, parole chiave comuni ed esempi.
Compila le stringhe di connessione in modo programmativo Crea stringhe di connessione in modo sicuro a partire dalla configurazione e dai segreti.
Gestione delle connessioni Apri, riutilizza e chiude le connessioni in modo pulito.
Pool di connessioni Ottimizzazione del pool, cicli di vita e schemi di riutilizzo.
Crittografia e certificati modalità di crittografia TLS, validazione dei certificati e TDS 8.0.
Autenticazione Microsoft Entra Autenticazione senza password per Azure SQL con identità gestita, principale di servizio, flussi interattivi e codice del dispositivo.
Procedure consigliate per la sicurezza Parametrizzazione, gestione dei segreti, privilegi minimi e crittografia.
Gruppi di disponibilità Connettersi ai gruppi di disponibilità Always On e alle repliche di sola lettura.

Uso dei dati

Articolo Descrizione
Esecuzione delle query execute, executemany, batch di istruzioni multiple e set di risultati.
Recupero dei dati fetchone, fetchmany, fetchall, e i modelli di streaming.
Query con parametri Associa i parametri in modo sicuro per prevenire l'iniezione SQL.
Procedure memorizzate Procedure di chiamata, parametri di lettura in uscita e set di risultati di processo.
Gestione del cursore Ciclo di vita dei cursori, scorrimento e ottimizzazione del parametro arraysize.
Oggetti a riga Accedi alle righe tramite indice, nome o come mappatura.
Gestione delle transazioni Commit, rollback, punti di salvataggio e livelli di isolamento.
Paginazione Paginazione keyset e offset per set di risultati di grandi dimensioni.
Gestione degli errori mssql_python.Error, DatabaseError, e la struttura di errore di SQL Server.
Logica di retry Rileva errori transitori e riprova con un retrocesso esponenziale.

Tipi di dati e caratteristiche di SQL Server

Articolo Descrizione
Mapping dei tipi di dati Tabella dei tipi e regole di conversione da SQL Server a Python.
Gestione delle date datetime, datetime2, datetimeoffset, e considerazioni sul fuso orario.
Decimale e tipi monetari Tipi numerici esatti e decimal.Decimal precisione.
Stringa e dati Unicode varchar, nvarchar, regole di confronto e pagine di codice.
Gestione di NULL Logica a tre valori, sentinelle e interoperabilità con pandas.
Dati binari varbinary, image e oggetti di grandi dimensioni trasmessi in streaming.
Convertitori di tipo personalizzato Registra i convertitori di input e output per i tipi personalizzati.
Operazioni di copia di massa Inserimenti ad alta velocità con l'API di copia in massa.
Dati JSON Memorizza, interroga e tritura JSON con FOR JSON e OPENJSON.
Dati XML Lavora con il xml tipo di dato, XPath e XQuery.
Dati spaziali i tipi geometry e geography di Python.
Colonne di tipo sparse Colonne sparse e insiemi di colonne per tabelle larghe.
Rilevamento dello schema Ispeziona database, tabelle, colonne e indici.

Integra con strumenti e framework Python

Articolo Descrizione
Integrazione con Apache Arrow Recupera i risultati come tabelle freccia per analisi a zero copia.
Integrazione di Pandas Carica i risultati delle query nei DataFrame e scrivili di nuovo.
Integrazione con Polars Usa Polar con mssql-python per carichi di lavoro columnari.
Integrazione con DuckDB Interroga i dati di SQL Server insieme alle tabelle locali di DuckDB.
Integrazione FastAPI Collega mssql-python ai servizi FastAPI.
Integrazione con Flask Usa mssql-python nelle applicazioni Flask.
Modelli asincroni Combina mssql-python con asyncio e thread pool.
Accesso ai dati e modelli di analisi Scegli il metodo di lettura giusto per l'accesso tramite cursore, l'estrazione con Arrow, pandas, Polars e l'analisi con DuckDB sui dati SQL.
Caricamento dei dati e schemi di movimento Scegli il metodo di scrittura corretto per l'inserimento di righe, la copia in blocco, gli upsert MERGE, il caricamento di DataFrame e l'importazione di file CSV.

Distribuire e gestire

Articolo Descrizione
Container e sviluppo locale Configura container Docker, devcontainer e pipeline CI per applicazioni Python che si collegano a SQL.
Ottimizzazione delle prestazioni Ottimizzazione del pool, istruzioni preparate, dimensioni dei batch e copia in blocco.
Risoluzione dei problemi Errori comuni, logging e diagnostica dei certificati.
Configurazione del modulo Impostazioni a livello di modulo, hook di logging e flag delle funzionalità.

Migra a mssql-python

Articolo Descrizione
Migrazione da pyodbc Mappare le API pyodbc e le stringhe di connessione in mssql-python.
Migrazione da pymssql Sostituisci pymssql con mssql-python mantenendo il comportamento.
Migrazione da SQLite Sposta i carichi di lavoro SQLite locali su SQL Server o Azure SQL.
Eseguire la migrazione da PostgreSQL Guida unica per gli sviluppatori Python che passano da PostgreSQL a SQL Server con mssql-python.

Riferimento

Articolo Descrizione
Ciclo di vita del supporto Versioni supportate di Python e SQL Server e frequenza di aggiornamento.
Novità Cronologia delle versioni e punti salienti della release.