Nouveautés dans mssql-python

Chaque version du pilote mssql-python introduit de nouvelles fonctionnalités, des améliorations de performance et des corrections de bugs. Les sections suivantes détaillent chaque version.

MSSQL-Python 1.11.0

Date de sortie : juillet 2026

Enhancements

Sémantique améliorée du gestionnaire de contexte

with connection: valide désormais correctement les transactions en cas de fermeture normale et les annule en cas d’exception, ce qui rend son comportement plus idiomatique en Python et plus prévisible.

import mssql_python

# On clean exit, transaction commits
with mssql_python.connect(connection_string) as conn:
    cursor = conn.cursor()
    cursor.execute("INSERT INTO MyTable (Name) VALUES ('Alice')")
    # Automatically committed on exit

# On exception, transaction rolls back
try:
    with mssql_python.connect(connection_string) as conn:
        cursor = conn.cursor()
        cursor.execute("INSERT INTO MyTable (Name) VALUES ('Bob')")
        raise ValueError("Oops!")
except ValueError:
    pass
# Changes rolled back on exit

Corrections de bugs

  • Correction d’un interblocage lié au GIL dans le processus de démontage d’ODBC (conn.close() et cursor.close()), ainsi que dans SQLDescribeParam pour les paramètres de valeur None, dans les configurations de tunnel SSH et de redirecteur en processus.
  • Paramètres fixes BINARY et VARBINARY NULL dans les tables temporaires et les variables de table. Lorsque la résolution automatique de type échoue, le pilote émet alors un avertissement Python avec des indications explicitescursor.setinputsizes().
  • Correction d’un problème empêchant import mssql_python de fonctionner sur Apple Silicon avec une installation propre (régression dans la version 1.8.0). Les dépendances ODBC dylib fournies sont désormais réécrites pour les architectures arm64 et x86_64.
  • Correction d’un blocage GIL dans le cœur Rust qui gelait les opérations de copie en masse lors de l’authentification avec Authentication=ActiveDirectoryServicePrincipal.

MSSQL-Python 1.10.0

Date de publication : juin 2026

Enhancements

Prise en charge de ActiveDirectoryServicePrincipal pour la copie en bloc

cursor.bulkcopy() prend désormais en charge Authentication=ActiveDirectoryServicePrincipal, permettant les insertions en bloc grâce aux informations d’identification du principal de service.

import mssql_python

conn = mssql_python.connect(
    "Server=<server>.database.windows.net;"
    "Database=<database>;"
    "Authentication=ActiveDirectoryServicePrincipal;"
    "UID=<application-client-id>;"
    "PWD=<client-secret>;"
    "Encrypt=yes"
)
cursor = conn.cursor()
cursor.execute("CREATE TABLE ##SpDemo (ID INT, Value FLOAT)")
conn.commit()

result = cursor.bulkcopy("##SpDemo", [(1, 1.5), (2, 2.5)])
print(f"Copied {result['rows_copied']} rows")

Corrections de bugs

  • Correction des données non ASCII dans VARCHAR et CHAR dans le chemin de récupération d’Arrow.
  • Correction des délais d’expiration de connexion lors des opérations de chargement en masse.

mssql-python 1.9.0

Date de publication : juin 2026

Enhancements

Objets de ligne dans la copie en masse

cursor.bulkcopy() accepte désormais directement les objets Row récupérés, sans nécessiter de conversion manuelle en tuple.

import mssql_python

conn = mssql_python.connect(connection_string)
cursor = conn.cursor()

# Fetch rows from source table
cursor.execute("SELECT ProductID, Name, ListPrice FROM Production.Product")
rows = cursor.fetchall()

# Pass fetched Row objects directly to bulkcopy
cursor.execute("CREATE TABLE ##RowBulkDemo (ProductID INT, Name NVARCHAR(50), ListPrice MONEY)")
conn.commit()
result = cursor.bulkcopy("##RowBulkDemo", rows)
print(f"Copied {result['rows_copied']} rows")

Corrections de bugs

  • Le système de roue fixe est donc simdutf toujours lié statiquement.
  • Correction des grandes DECIMAL insertions dans executemany().
  • Correction du type incorrect de repli pour les paramètres NULL.
  • Exception fixe des allers-retours aller-retour de cornichon et de décroche.
  • Correction de nextset() afin qu’il conserve les messages PRINT d’un ensemble de résultats à l’autre.
  • Correction de la gestion de Row dans le chemin de repli des données à l’exécution de executemany().
  • Vérification du type de méthode de récupération fixe pour les outils d’analyse statique.

mssql-python 1.8.0

Date de publication : mai 2026

Enhancements

Prise en charge de ActiveDirectoryMSI pour la copie en bloc

cursor.bulkcopy() Prend désormais en compte Authentication=ActiveDirectoryMSI les identités managées assignées par le système et par l’utilisateur.

import mssql_python

# System-assigned managed identity
conn = mssql_python.connect(
    "Server=<server>.database.windows.net;"
    "Database=<database>;"
    "Authentication=ActiveDirectoryMSI;"
    "Encrypt=yes"
)
cursor = conn.cursor()
cursor.execute("CREATE TABLE ##MsiDemo (ID INT, Name NVARCHAR(50))")
conn.commit()

result = cursor.bulkcopy("##MsiDemo", [(1, "Alice"), (2, "Bob")])
print(f"Copied {result['rows_copied']} rows")

Indexation de ligne par clé de type chaîne

Vous pouvez désormais accéder aux valeurs de ligne par nom de colonne, par exemple row["col"], en plus de l’indexation positionnelle et de l’accès aux attributs.

import mssql_python

conn = mssql_python.connect(connection_string)
cursor = conn.cursor()

cursor.execute("SELECT ProductID, Name, ListPrice FROM Production.Product WHERE ProductID = 1")
row = cursor.fetchone()

# Access by column name (new in 1.8.0)
print(row["ProductID"]) # Access by key
print(row["Name"])

# Still supports positional indexing
print(row[0])           # Positional access

# And attribute access
print(row.Name)         # Attribute access

Mise à jour du pilote ODBC incluse

Le pilote Microsoft ODBC pour SQL Server fourni a été mis à jour à la version 18.6.2.1.

Corrections de bugs

  • Correction des problèmes liés à la durée de vie différée de l’attribut de connexion dans l’authentification basée sur des jetons.
  • Correction de l’analyse répétée de la chaîne de connexion dans le processus d’authentification.
  • Annotations de type fixe executemany() pour les entrées de séquence.

MSSQL-Python 1.7.1

Date de publication : mai 2026

Enhancements

Couverture des roues élargie et améliorations de performance

Cette version ajoute des wheels compatibles avec RHEL 8, rétablit les wheels macOS pour Python 3.10 universal2, améliore la prise en charge de l’UTF-16 grâce à simdutf, et optimise le chemin critique de execute().

Impact sur la performance : Le débit d’exécution par lots s’améliore de ~15% sur les charges de travail typiques grâce aux optimisations du chemin chaud dans la execute() méthode.

Corrections de bugs

  • Correction des échecs de connexion afin qu’ils génèrent des exceptions DB-API mssql_python au lieu de RuntimeError.
  • Libération étendue de GIL en bloquant l’exécution, la récupération, la transaction et les appels d’attributs de connexion ODBC.
  • Correction des défaillances executemany() lorsque les valeurs décimales changent de signe.
  • Correction du décodage incohérent de CP1252 VARCHAR selon les plateformes.
  • Correction des échecs liés aux chaînes vides dans les colonnes NVARCHAR(MAX) et VARCHAR(MAX)cursor.bulkcopy().

Note

La version 1.7.0 a été retirée en raison de problèmes de publication. Utilisez la version 1.7.1 ou ultérieure.

MSSQL-Python 1.6.0

Date de publication : avril 2026

Enhancements

Sanitisation de chaîne de connexion basée sur l’analyseur syntaxique

Cette amélioration garantit un analyse correcte des caractères spéciaux dans les champs de mot de passe et les valeurs avec crochets.

import mssql_python

# Complex passwords with special characters now parse correctly
conn = mssql_python.connect(
    "Server=<server>.database.windows.net;"
    "Database=<database>;"
    "UID=user@contoso;"
    "PWD={p@ssw0rd;with{braces}};"  # Braced values now handled correctly
    "Encrypt=yes"
)

La salubritisation des Connection string est passée de la logique basée sur des regex au traitement basé sur l’analyseur syntaxique pour une gestion correcte de la syntaxe des chaîne de connexion ODBC.

Corrections de bugs

  • Correction de la libération du GIL lors des opérations bloquantes de connexion et de déconnexion ODBC.
  • Correction setinputsizes() des plantages avec SQL_DECIMAL et SQL_NUMERIC des indices.
  • Correction du comportement incorrect fetchone() pour les méthodes du catalogue ODBC.
  • Correction des erreurs liées à un état de curseur non valide lorsque reset_cursor=False est utilisé.
  • Indices de type fixe executemany() pour des séquences de paramètres basées sur la cartographie.
  • Ajout d’une protection contre la traversée de chemin pour setup_logging(log_file_path=...).

MSSQL-Python 1.5.0

Date de publication : avril 2026

Nouvelles fonctionnalités

Prise en charge de la récupération Apache Arrow

Trois nouvelles méthodes de curseur permettent une récupération de données en colonnes haute performance via l’interface de données Arrow C :

  • cursor.arrow() renvoie un fichier complet pyarrow.Table.
  • cursor.arrow_batch() renvoie un seul pyarrow.RecordBatch.
  • cursor.arrow_reader() renvoie un pyarrow.RecordBatchReader pour le streaming.

L’implémentation contourne la création d’objets Python dans le chemin chaud pour améliorer les performances. Pour une documentation complète, voir l’intégration d’Apache Arrow.

prise en charge du type sql_variant

Le pilote détecte désormais les colonnes sql_variant lors de la récupération, résout leur type de base sous-jacent et renvoie des valeurs Python correctement typées au lieu d’octets bruts.

Note

sql_variant Les colonnes utilisent un chemin de récupération en streaming, qui peut avoir un léger impact sur les performances par rapport aux colonnes de type fixe.

Soutien natif de l’UUID

Un nouveau paramètre native_uuid permet de définir si les colonnes UNIQUEIDENTIFIER sont renvoyées sous forme d’objets uuid.UUID (par défaut) ou sous forme de chaînes en majuscules compatibles avec pyodbc. Configurez-le au niveau du module ou par connexion :

# Module-level default
settings = mssql_python.get_settings()
settings.native_uuid = True  # default

# Per-connection override
conn = mssql_python.connect(connection_string, native_uuid=False)

Pour plus d’informations, voir Configuration du module.

Export public de la classe Row

La Row classe est désormais exportée au niveau supérieur pour les annotations de type :

from mssql_python import Row

Corrections de bugs

  • Correction des faux positifs de détection de ? dans les identifiants entre crochets, les chaînes littérales et les commentaires.
  • Correction de la liaison de paramètres NULL pour les colonnes VARBINARY (ne provoque plus d’erreurs de conversion implicites).
  • Correction de la perte de microsecondes dans les valeurs datetime.time lors des allers-retours pour les colonnes TIME(1) à TIME(7).
  • Correction du chemin de récupération Arrow pour inclure correctement les fractions de seconde pour les colonnes TIME.
  • Correction de la copie en masse avec les méthodes d’authentification Microsoft Entra ID (les champs d’identifiants obsolètes ne causent plus d’erreurs de validation).
  • Mise en cache des instances d’identifiants Azure Identity au niveau du module pour améliorer les performances d’authentification.

mssql-python 1.4.0

Date de sortie : mars 2025

Nouvelles fonctionnalités

Prise en charge de la copie en masse

Le chargement de données massives à hautes performances est désormais disponible via cursor.bulkcopy():

import mssql_python

conn = mssql_python.connect(connection_string)
cursor = conn.cursor()

cursor.execute("CREATE TABLE ##BulkDemo (ID INT, Name NVARCHAR(50), Price DECIMAL(10,2))")
conn.commit()

data = [
    (1, "Item 1", 10.50),
    (2, "Item 2", 20.75),
    # ... potentially millions of rows
]

result = cursor.bulkcopy("##BulkDemo", data)
print(f"Copied {result['rows_copied']} rows")

La méthode accepte les options pour batch_size, timeout, column_mappings, keep_identity, check_constraintstable_lock, keep_nulls, , fire_triggers, et use_internal_transaction.

Voir la copie en bloc pour la documentation complète.

Improvements

  • Optimisations de performance pour de grands ensembles de résultats.
  • Réduction de l’utilisation de la mémoire lors des opérations batch.
  • Messages d’erreur améliorés pour les échecs de copies en masse.

MSSQL-Python 1.3.0

Date de sortie : janvier 2025

Nouvelles fonctionnalités

Classe de réglages

Configurez le comportement à l’échelle du module via la nouvelle Settings classe :

import mssql_python

settings = mssql_python.get_settings()
settings.lowercase = True       # Lowercase column names in cursor.description

Voir la configuration du module pour plus de détails.

Improvements

  • Meilleure gestion du délai d’expiration de la connexion lors du basculement d’Azure SQL.
  • Compatibilité améliorée avec Python 3.13.

MSSQL-Python 1.2.0

Date de sortie : novembre 2024

Nouvelles fonctionnalités

Méthodes de découverte de schéma

Nouvelles méthodes de curseur pour l’exploration des métadonnées de base de données :

cursor = conn.cursor()

# List all tables
cursor.tables(schema="dbo")

# Get column information
cursor.columns(table="Product", schema="Production")

# Get primary keys
cursor.primaryKeys(table="Product", schema="Production")

# Get foreign key relationships
cursor.foreignKeys(table="SalesOrderDetail", schema="Sales")

# Get stored procedures
cursor.procedures(schema="dbo")

# Get index statistics
cursor.statistics(table="Product", schema="Production")

# Get type information
cursor.getTypeInfo()

Voir Découverte du schéma pour la documentation complète.

Improvements

  • Mise en cache améliorée des métadonnées pour les requêtes répétées de schéma.
  • Meilleure gestion des colonnes calculées dans les résultats columns().

mssql-python 1.1.0

Date de sortie : septembre 2024

Nouvelles fonctionnalités

Convertisseurs de sortie personnalisés

Enregistrer des fonctions personnalisées pour transformer les valeurs des colonnes lors de la récupération :

import mssql_python
from decimal import Decimal

conn = mssql_python.connect(connection_string)

# Convert decimals to float (converter receives Decimal)
def decimal_to_float(value):
    if value is None:
        return None
    return float(value)  # value is already a Decimal object

conn.add_output_converter(mssql_python.SQL_DECIMAL, decimal_to_float)

# Custom money formatting
def format_money(value):
    if value is None:
        return "$0.00"
    return f"${float(value):,.2f}"  # value is already a Decimal object

conn.add_output_converter(mssql_python.SQL_DECIMAL, format_money)

Méthodes de gestion :

  • add_output_converter(sql_type, converter_func)
  • get_output_converter(sql_type)
  • remove_output_converter(sql_type)
  • clear_output_converters()

Pour une documentation complète, voir Convertisseurs de type personnalisé.

Improvements

  • Meilleurs messages d’erreur pour les échecs de conversion de type.
  • Prise en charge des fonctions de convertisseur qui retournent None.

MSSQL-Python 1.0.0

Date de sortie : juillet 2024

Version initiale en disponibilité générale

La première version de disponibilité générale de mssql-python, le pilote Python natif de Microsoft pour SQL Server.

Fonctionnalités de base

  • Architecture DDBC : Connectivité directe à la base de données sans nécessiter d’installation de pilotes ODBC.
  • Conformité à la DB-API 2.0 : Interface de base de données Python standard.
  • Pool de connexions : gestion intégrée du pool de connexions.
  • Authentification Microsoft Entra : Prise en charge complète de l’authentification basée sur l’identité Azure.
  • Chiffrement TLS : Connexions sécurisées avec validation de certificat.

Caractéristiques de connexion

  • 21 mots-clés de chaîne de connexion.
  • 9 modes d’authentification (SQL, Windows, et 7 méthodes Microsoft Entra ID).
  • Contrôle de la validation automatique.
  • Méthodes d’exécution : execute(), executemany(), et batch_execute().
  • Attributs de connexion via set_attr() et getinfo().
  • Support du gestionnaire de contexte.

Caractéristiques du curseur

  • Méthodes standard de récupération : fetchone(), fetchmany(), fetchall().
  • Méthodes étendues : fetchval(), skip().
  • Méthodes d’exécution : execute() et executemany().
  • Objets de ligne avec accès par attribut et par indice.
  • Navigation dans plusieurs ensembles de résultats avec nextset().

Prise en charge des types de données

  • Tous les types natifs SQL Server.
  • Correspondances de types Python↔SQL.
  • Constantes de type SQL pour le type explicite (par exemple, mssql_python.SQL_DECIMAL).
  • Gestion de NULL en Python None.

Prise en charge des transactions

  • Validation manuelle et annulation.
  • Mode d’engagement automatique.
  • Contrôle du niveau d’isolement.
  • Détection et gestion des blocages.

Modes d’authentification

Mode Description
Authentification de SQL Server Nom d'utilisateur et mot de passe
Authentification Windows Trusted_Connection
ActiveDirectoryDefault DefaultAzureCredential
ActiveDirectoryInteractive Connexion basée sur navigateur
ActiveDirectoryDeviceCode Flux de code de périphérique
Mot de passe Active Directory Nom d’utilisateur et mot de passe Microsoft Entra (déprécié ; utilise ROPC)
ActiveDirectoryMSI Identité gérée
ActiveDirectoryServicePrincipal Service Principal
Intégré à Active Directory Windows Kerberos

Upgrade

De pyodbc

Pour des conseils détaillés sur la migration, voir Migrer depuis pyodbc.

Principales différences :

  • Les styles de paramètres ? (qmark) et %(name)s (pyformat) sont pris en charge. Vos requêtes existantes ? fonctionnent sans modifications.
  • Aucune callproc() méthode. Utilisez EXECUTE à la place.
  • Pool de connexions intégré.
  • Aucune dépendance externe à un pilote ODBC.

À partir de pymssql

Pour des conseils détaillés sur la migration, voir Migrer à partir de pymssql.

Principales différences :

  • Remplacer les marqueurs de paramètre %s et %d par ? ou %(name)s.
  • Utilisez une chaîne de connexion au lieu d’arguments positionnels.
  • Pas de dépendance à FreeTDS.
  • Plusieurs curseurs simultanés par connexion.
  • Les objets de ligne avec accès à l’attribut remplacent as_dict=True.

Entre les versions mssql-python

Mettez à jour le pilote pour obtenir de nouvelles fonctionnalités et corrections.

pip install --upgrade mssql-python

Vérifiez les notes de version pour détecter d’éventuels changements avant de mettre à jour les systèmes de production.

Feuille de route

Pour les fonctionnalités à venir et la feuille de route de développement, consultez le dépôt GitHub.