Microsoft Python Driver pour SQL Server - mssql-python

mssql-pythonest le pilote Python de Microsoft pour SQL Server, Azure SQL Database, Azure SQL Managed Instance et la base de données SQL dans Microsoft Fabric. Il utilise la connectivité directe à base de données (DDBC), ce qui permet de vous connecter sans installer de gestionnaire de pilotes externe. Le pilote prend en charge Python 3.10 ou versions ultérieures et est conforme à la spécification API de base de données Python 2.0 tout en ajoutant des améliorations adaptées à Python pour le développement quotidien.

Choisir votre point de départ

Base de référence de production pour Azure SQL

Utilisez cet exemple comme point de départ pour une connexion Azure SQL orientée production. Il lit la configuration de l’environnement, s’authentifie avec une identité gérée, et permet le chiffrement Tabular Data Stream (TDS) 8.0. Il définit également les délais de connexion et de requête par état, réessaie les échecs transitoires avec un retour exponentiel (une connexion fraîche pour les erreurs de connexion, la même connexion pour les erreurs de requête comme les blocages), enregistre les résultats et s’appuie sur les gestionnaires de contexte pour libérer les ressources.

Les mots-clés ConnectRetryCount et ConnectRetryInterval de la chaîne de connexion activent la résilience des connexions inactives de SQL Server : le pilote rétablit automatiquement une connexion inactive interrompue. Cela se distingue de la réévaluation au niveau de l’application dans cet exemple, qui retente une requête échouant avec une erreur transitoire telle qu’un blocage ou un délai d’attente de requête. Les deux sont complémentaires, donc gardez les deux.

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

Pour des conseils plus approfondis sur chaque problème de cet exemple, voir authentification Microsoft Entra, Pooling de connexions, Chiffrement et certificats, Logique de tentative et Gestion des erreurs.

Principales fonctionnalités

  • Conformité à la PEP 249 : interfaces standard connect, cursor, execute et fetch*, ainsi que des extensions pythoniques.
  • Connectivité directe à la base de données (DDBC) : Aucun gestionnaire de pilotes externe requis. Installez mssql-python et vous êtes prêt à vous connecter.
  • Authentification Microsoft Entra ID : prise en charge intégrée des modes d’authentification, y compris les identités managées et les principaux de service.
  • SQL Server et Authentification Windows : connexions SQL, Kerberos et connexion unique (SSO) Windows sur les plateformes prises en charge.
  • Copie en bloc : insertion en masse à hautes performances pour de gros volumes de données avec prise en charge native du protocole TDS.
  • Prise en charge des types de données natifs : JSON, XML, spatial, colonnes éparses, datetimeoffset et decimal/money avec une gestion précise.
  • Intégration Apache Arrow : ensembles de résultats zéro copie pour un échange rapide de données avec pandas, Polar et DuckDB.
  • Modèles asynchrones : utilisez le pilote avec des applications basées sur asyncio et FastAPI, via des solutions de contournement avec ThreadPoolExecutor. Voir Motifs asynchrones pour les motifs d’intégration.
  • TLS par défaut : le chiffrement TLS et la validation des certificats sont activés par défaut (via le pilote ODBC 18). Le chiffrement TDS 8.0 est disponible lorsque vous définissez Encrypt=strict.

Commencez

Article Description
Installation Installez mssql-python et vérifiez votre environnement Python.
Démarrage rapide : Connectez-vous avec mssql-python Connectez-vous à une instance locale ou testez SQL Server et lancez votre première requête.
Démarrage rapide : Connectez-vous depuis un Jupyter Notebook Utilisez mssql-python dans un carnet pour une exploration interactive des données.
Démarrage rapide : Copie en bloc Transférez de grands ensembles de données dans SQL Server avec l’API de copie en masse.
Démarrage rapide : Prototypage rapide Construis rapidement de petits scripts et des preuves de concept.
Démarrage rapide : Déploiements répétables Emballer, configurer et livrer des applications Python qui communiquent avec SQL.
Démarrage rapide Apache Arrow Récupérez les résultats des requêtes sous forme de tables Apache Arrow pour les flux de travail analytiques.

Configurer et authentifier

Article Description
Chaînes de connexion Syntaxe des chaînes de connexion, mots-clés courants et exemples.
Construire les chaînes de connexion de façon programmatique Composez les chaînes de connexion en toute sécurité à partir de la configuration et des secrets.
Gestion des connexions Ouvrir, réutiliser et fermer les connexions proprement.
Regroupement de connexions Réglage de la piscine, durée de vie et motifs de réutilisation.
Chiffrement et certificats Modes de chiffrement TLS, validation de certificats et TDS 8.0.
Authentification Microsoft Entra Authentification sans mot de passe pour Azure SQL avec identité managée, principal de service, flux interactifs et codes de l’appareil.
Bonnes pratiques de sécurité Paramétrage, gestion des secrets, privilège minimum et chiffrement.
Groupes de disponibilité Connectez-vous aux groupes de disponibilité Always On et aux répliques en lecture seule.

Utiliser des données

Article Description
Exécution des requêtes execute, executemany, des lots d’instructions multiples et des ensembles de résultats.
Récupération des données fetchone, fetchmany, fetchall, et les schémas de streaming.
Requêtes paramétrables Liez les paramètres en toute sécurité pour éviter l’injection SQL.
procédures stockées Procédures d’appel, paramètres de lecture de sortie et ensembles de résultats de processus.
Gestion du curseur Durée de vie des curseurs, défilement et réglage de la taille du tableau.
Objets de ligne Accédez aux lignes par indice, par leur nom ou sous forme de mappages.
Gestion des transactions Validation, annulation, points de sauvegarde et niveaux d’isolation.
Pagination Modèles de pagination par clé et par décalage sur de grands ensembles de résultats.
Gestion des erreurs mssql_python.Error, DatabaseError, et la structure d’erreur de SQL Server.
Logique de nouvelle tentative Détectez les erreurs transitoires et réessayez avec une temporisation exponentielle.

Types de données et fonctionnalités de SQL Server

Article Description
Mappages de types de données Tableaux et règles de conversion de type SQL Server-to-Python.
Gestion des dates et heures datetime, datetime2, datetimeoffset, et considérations sur les fuseaux horaires.
Décimales et types monétaires Types numériques exacts et précision decimal.Decimal
Données de chaîne et Unicode varchar, nvarchar, collations et pages de codes.
Gestion des valeurs NULL La logique à trois valeurs, les sentinelles et les pandas s’interopparent.
Données binaires varbinary, image et les objets volumineux en flux.
Convertisseurs de type personnalisés Enregistrez les convertisseurs d’entrée et de sortie pour les types personnalisés.
Opérations de copie en bloc Insertion à haut débit avec l’API de copiage en masse.
Données JSON Stockez, interrogez et déchiquetez JSON avec FOR JSON et OPENJSON.
Données XML Travaille avec le xml type de données XPath et XQuery.
Données spatiales geometryet geography des types issus de Python.
Colonnes éparses Colonnes éparses et ensembles de colonnes pour les tables larges.
Découverte de schéma Inspectez les bases de données, tableaux, colonnes et index.

Intégrer avec des outils et frameworks Python

Article Description
Intégration Apache Arrow Récupérez les résultats sous forme de tables de flèches pour des analyses sans copie.
intégration de pandas Chargez les résultats des requêtes dans DataFrames et écrivez-les en retour.
Intégration polaire Utilisez Polars avec mssql-python pour les charges de travail colonnaires.
Intégration DuckDB Interrogez les données de SQL Server en même temps que les tables locales de DuckDB.
Intégration FastAPI Connectez mssql-python aux services FastAPI.
Intégration de Flask Utilisez mssql-python dans les applications Flask.
Motifs asynchrones Combinez mssql-python avec asyncio et des pools de threads.
Accès aux données et modes d’analyse Choisissez le bon chemin de lecture pour l’accès au curseur, l’extraction Arrow, les pandas, les Polar et les analyses DuckDB plutôt que les données SQL.
Chargement des données et schémas de déplacement Choisissez le bon chemin d’écriture pour les insertions de lignes, la copie en masse, les MERGE upserts, le chargement DataFrame et l’ingestion CSV.

Déployer et exploiter

Article Description
Développement dans des conteneurs et en local Configurez des conteneurs Docker, des devcontainers et des pipelines CI pour les applications Python connectées à SQL.
Réglage des performances Réglage de pool, déclarations préparées, tailles de lots et copies en bloc.
Résolution des problèmes Erreurs courantes, journalisation et diagnostics de certificats.
Configuration des modules Paramètres du module, points d’accroche de journalisation et indicateurs de fonctionnalités.

Migrer vers mssql-python

Article Description
Migrer depuis pyodbc Mapez les API pyodbc et les chaînes de connexion vers mssql-python.
Migrer depuis pymssql Remplacez pymssql par mssql-python tout en préservant le comportement.
Migrer depuis SQLite Déplacez les charges de travail SQLite locales vers SQL Server ou Azure SQL.
Migrer à partir de PostgreSQL Guide unique pour les développeurs Python passant de PostgreSQL à SQL Server avec mssql-python.

Référence

Article Description
Cycle de vie de support Versions prises en charge de Python et SQL Server, et la cadence des mises à jour.
Nouveautés Historique des versions et points forts des versions.