Novedades en mssql-python

Cada versión del controlador mssql-python introduce nuevas funcionalidades, mejoras de rendimiento y correcciones de errores. Las siguientes secciones detallan cada versión.

MSSQL-Python 1.11.0

Fecha de lanzamiento: julio de 2026

Enhancements

Semántica mejorada del gestor de contexto

with connection: ahora confirma correctamente las transacciones al finalizar correctamente y las revierte si se produce una excepción, lo que lo hace más idiomático de Python y predecible.

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

Correcciones de errores

  • Se ha corregido un interbloqueo del GIL en el proceso de desmontaje de ODBC (conn.close() y cursor.close()) y en SQLDescribeParam para parámetros con valor None en configuraciones de túnel SSH y de reenviador en proceso.
  • Parámetros fijos BINARY y VARBINARY NULL en tablas temporales y variables de tabla. Cuando falla la resolución automática de tipos, el controlador ahora emite una advertencia de Python con indicaciones explícitas cursor.setinputsizes().
  • Corregido el fallo de import mssql_python en Apple Silicon tras una instalación limpia (regresión en 1.8.0). Las dependencias dylib de ODBC incluidas ahora se han reescrito para las arquitecturas arm64 y x86_64.
  • Se solucionó un deadlock GIL en el núcleo de Rust que congelaba las operaciones de copia masiva al autenticar con Authentication=ActiveDirectoryServicePrincipal.

MSSQL-Python 1.10.0

Fecha de lanzamiento: junio de 2026

Enhancements

Soporte de ActiveDirectoryServicePrincipal para copia masiva

cursor.bulkcopy() ahora admite Authentication=ActiveDirectoryServicePrincipal, lo que permite inserciones masivas mediante credenciales de entidad de servicio.

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

Correcciones de errores

  • Se corrigieron los datos no ASCII VARCHAR y CHAR en la ruta de obtención de Arrow.
  • Se corrigieron los tiempos de espera de conexión durante las operaciones de carga masiva.

MSSQL-Python 1.9.0

Fecha de lanzamiento: junio de 2026

Enhancements

Objetos de fila en copia masiva

cursor.bulkcopy() ahora acepta objetos obtenidos Row directamente en lugar de requerir conversión manual de tuplas.

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

Correcciones de errores

  • Embalaje de ruedas fijas, así que simdutf siempre está vinculado estáticamente.
  • Se corrigieron las inserciones grandes DECIMAL en executemany().
  • Se corrigió el fallback incorrecto de tipo para parámetros NULL.
  • Se corrigieron las excepciones en los procesos de serialización y deserialización.
  • Se ha corregido nextset() para que conserve los mensajes de PRINT entre distintos conjuntos de resultados.
  • Se corrigió el manejo de Row en la ruta alternativa de executemany() data-at-execution.
  • Se corrigió la comprobación de tipos del método fetch para las herramientas de análisis estático.

MSSQL-Python 1.8.0

Fecha de lanzamiento: mayo de 2026

Enhancements

Soporte de ActiveDirectoryMSI para copia masiva

cursor.bulkcopy() ahora admite Authentication=ActiveDirectoryMSI para identidades administradas por el sistema y asignadas por el usuario.

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

Indexación de filas mediante claves de cadena

Ahora puedes acceder a valores de fila por nombre de columna, por ejemplo row["col"], además de indexación posicional y acceso a atributos.

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

Actualización incluida del controlador ODBC

El controlador Microsoft ODBC para SQL Server incluido se actualizó a la versión 18.6.2.1.

Correcciones de errores

  • Se corrigieron problemas de duración del atributo de conexión diferida en la autenticación basada en tokens.
  • Se corrigió el análisis repetido de la cadena de conexión en la ruta de autenticación.
  • Anotaciones de tipo fijo executemany() para entradas de secuencia.

mssql-python 1.7.1

Fecha de lanzamiento: mayo de 2026

Enhancements

Ampliación de la cobertura de las ruedas y mejoras en el rendimiento

Esta versión añade ruedas compatibles con RHEL 8, restaura las ruedas Python 3.10 universal2 de macOS, mejora el manejo del UTF-16 mediante simdutf, y optimiza el execute() camino caliente.

Impacto en el rendimiento: El rendimiento de ejecución por lotes mejora en ~15% respecto a las cargas de trabajo típicas gracias a las optimizaciones de rutas calientes en el execute() método.

Correcciones de errores

  • Se corrigieron los fallos de inicio de sesión para que generaran excepciones de DB-API mssql_python en lugar de RuntimeError.
  • Liberación extendida de GIL bloqueando la ejecución, obtención, transacción y llamadas a atributos de conexión ODBC.
  • Se corrigieron fallos executemany() al cambiar de signo los valores decimales.
  • Se ha corregido la decodificación inconsistente de CP1252 VARCHAR en distintas plataformas.
  • Se corrigieron los fallos cursor.bulkcopy() con las cadenas vacías en las columnas NVARCHAR(MAX) y VARCHAR(MAX).

Note

La versión 1.7.0 fue retirada debido a problemas de publicación. Usa la versión 1.7.1 o posterior.

MSSQL-Python 1.6.0

Fecha de lanzamiento: abril de 2026

Enhancements

Sanitización de cadenas de conexión basada en analizador

Esta mejora garantiza el procesamiento correcto de caracteres especiales en los campos de contraseña y en los valores entre llaves.

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 sanitización de la cadena de conexión pasó de una lógica basada en expresiones regulares a un procesamiento basado en analizador sintáctico para gestionar correctamente la sintaxis de las cadenas de conexión ODBC.

Correcciones de errores

  • Se solucionó la liberación de GIL al bloquear las operaciones de conexión y desconexión ODBC.
  • Se corrigieron los cuelgues de setinputsizes() con las sugerencias SQL_DECIMAL y SQL_NUMERIC.
  • Se corrigió el comportamiento incorrecto fetchone() de los métodos del catálogo ODBC.
  • Se corrigen errores de estado inválido del cursor cuando reset_cursor=False se usa.
  • Se corrigieron las anotaciones de tipo executemany() para secuencias de parámetros basadas en mapeos.
  • Se añadió una protección de recorrido de ruta para setup_logging(log_file_path=...).

MSSQL-Python 1.5.0

Fecha de lanzamiento: abril de 2026

Características nuevas

Soporte de búsqueda de Apache Arrow

Tres nuevos métodos de cursor proporcionan una recuperación de datos columnares de alto rendimiento a través de la Interfaz de Datos Arrow C:

  • cursor.arrow() devuelve pyarrow.Table completo.
  • cursor.arrow_batch() devuelve un solo pyarrow.RecordBatch.
  • cursor.arrow_reader() devuelve un pyarrow.RecordBatchReader para transmisión en flujo.

La implementación evita la creación de objetos en Python en la ruta caliente para mejorar el rendimiento. Para la documentación completa, véase integración con Apache Arrow.

Soporte para el tipo sql_variant

El controlador ahora detecta columnas sql_variant al recuperar los datos, resuelve su tipo base real y devuelve valores de Python correctamente tipados en lugar de bytes sin procesar.

Note

sql_variant Las columnas utilizan una ruta de obtención en streaming, que puede tener un pequeño impacto en el rendimiento en comparación con las columnas de tipo fijo.

Soporte nativo UUID

Una nueva native_uuid configuración controla si UNIQUEIDENTIFIER las columnas se devuelven como uuid.UUID objetos (por defecto) o como cadenas mayúsculas compatibles con pyodbc. Configúralo a nivel de módulo o por conexión:

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

Para más información, véase Configuración de módulos.

Exportación pública de la clase Row

La clase Row ahora se exporta en el nivel superior para anotaciones de tipo:

from mssql_python import Row

Correcciones de errores

  • Se corrigió la detección de falsos positivos ? dentro de identificadores entre corchetes, literales de cadena y comentarios.
  • Se corrigió la asociación de parámetros NULL para las columnas VARBINARY (ya no genera errores de conversión implícita).
  • Se corrigió un problema por el que los valores datetime.time perdían microsegundos en conversiones de ida y vuelta en columnas de TIME(1) a TIME(7).
  • Se ha corregido la ruta de obtención de Arrow para incluir correctamente segundos fraccionarios en las columnas TIME.
  • Copia masiva corregida con métodos de autenticación Microsoft Entra ID (los campos de credenciales obsoletos ya no causan errores de validación).
  • Caché instancias de credenciales de identidad de Azure a nivel de módulo para mejorar el rendimiento de autenticación.

MSSQL-Python 1.4.0

Fecha de lanzamiento: marzo de 2025

Características nuevas

Soporte para copias masivas

La carga masiva de datos de alto rendimiento ahora está disponible a través de: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")

El método acepta opciones para batch_size, timeout, column_mappings, keep_identity, check_constraintstable_lock, keep_nulls, fire_triggers, , y use_internal_transaction.

Consulte copia en bloque para obtener la documentación completa.

Improvements

  • Optimizaciones de rendimiento para conjuntos de resultados grandes.
  • Menor uso de memoria durante operaciones por lotes.
  • Mensajes de error mejorados para errores en la copia masiva.

MSSQL-Python 1.3.0

Fecha de lanzamiento: enero de 2025

Características nuevas

Clase de escenarios

Configura el comportamiento a nivel de módulo a través de la nueva Settings clase:

import mssql_python

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

Consulta la configuración del módulo para más detalles.

Improvements

  • Mejor gestión del tiempo de espera de conexión durante el conmutamiento por error de Azure SQL.
  • Compatibilidad mejorada con Python 3.13.

MSSQL-Python 1.2.0

Fecha de lanzamiento: noviembre de 2024

Características nuevas

Métodos de descubrimiento de esquemas

Nuevos métodos de cursor para la exploración de metadatos de bases de datos:

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

Consulta Descubrimiento de esquemas para la documentación completa.

Improvements

  • Caché mejorada de metadatos para consultas repetidas de esquemas.
  • Mejor gestión de las columnas calculadas en los resultados de columns().

mssql-python 1.1.0

Fecha de lanzamiento: septiembre de 2024

Características nuevas

Convertidores de salida personalizados

Registrar funciones personalizadas para transformar los valores de las columnas durante la obtención:

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étodos de manejo:

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

Para la documentación completa, véase Convertidores de tipo personalizado.

Improvements

  • Mejores mensajes de error para fallos de conversión de tipos.
  • Soporte para funciones de convertidor que devuelven None.

MSSQL-Python 1.0.0

Fecha de lanzamiento: julio de 2024

Lanzamiento inicial de disponibilidad general

La primera versión de disponibilidad general de mssql-python, el controlador nativo de Python de Microsoft para SQL Server.

Características principales

  • Arquitectura DDBC: Conectividad directa con bases de datos sin necesidad de instalación de controladores ODBC.
  • Cumplimiento de DB-API 2.0: Interfaz estándar de Python para bases de datos.
  • Agrupación de conexiones: Gestión integrada de la agrupación de conexiones.
  • Autenticación Microsoft Entra: Soporte completo para autenticación basada en identidad en Azure.
  • Cifrado TLS: Conexiones seguras con validación de certificados.

Características de conexión

  • 21 palabras clave de cadena de conexión.
  • 9 modos de autenticación (SQL, Windows y 7 métodos Microsoft Entra ID).
  • Control de confirmación automática.
  • Métodos de ejecución: execute(), executemany(), y batch_execute().
  • Atributos de conexión a través de set_attr() y getinfo().
  • Soporte para gestores de contexto.

Características del cursor

  • Métodos estándar de búsqueda: fetchone(), fetchmany(), fetchall().
  • Métodos extendidos: fetchval(), skip().
  • Métodos de ejecución: execute() y executemany().
  • Objetos de fila con acceso por atributos y por índice.
  • Navegación por conjuntos de resultados múltiples con nextset().

Compatibilidad con tipos de datos

  • Todos los tipos nativos de SQL Server.
  • Correspondencia de tipos entre Python y SQL.
  • Constantes de tipo SQL para tipado explícito (por ejemplo, mssql_python.SQL_DECIMAL).
  • Manejo de NULL como en Python None.

Compatibilidad con transacciones

  • Confirmación y reversión manuales.
  • Modo de confirmación automática.
  • Control de nivel de aislamiento.
  • Detección y manejo de bloqueos.

Modos de autenticación

Mode Descripción
Autenticación de SQL Server Nombre de usuario y contraseña
autenticación de Windows Trusted_Connection
ActiveDirectoryDefault DefaultAzureCredential
ActiveDirectoryInteractive Inicio de sesión basado en navegador
ActiveDirectoryDeviceCode Flujo de código de dispositivo
ActiveDirectoryPassword Nombre de usuario y contraseña de Microsoft Entra (obsoleto; usa ROPC)
ActiveDirectoryMSI Identidad administrada
ActiveDirectoryServicePrincipal Entidad principal de servicio
ActiveDirectoryIntegrated Windows Kerberos

Upgrade

De pyodbc

Para una guía detallada sobre migración, véase Migrar desde pyodbc.

Diferencias clave:

  • Se admiten tanto ? (qmark) como %(name)s (pyformat) como estilos de parámetros. Tus consultas existentes ? funcionan sin cambios.
  • No existe el método callproc(). Utiliza EXECUTE sentencias en su lugar.
  • Agrupación de conexiones integrada.
  • No requiere controladores ODBC externos.

De pymssql

Para una guía detallada sobre migración, véase Migrar desde pymssql.

Diferencias clave:

  • Reemplazar %s y %d los marcadores de parámetros por ? o %(name)s.
  • Usa una cadena de conexión en lugar de argumentos posicionales.
  • No dependía de FreeTDS.
  • Múltiples cursores concurrentes por conexión.
  • Los objetos de fila con acceso a atributos reemplazan as_dict=Truea .

Entre versiones de mssql-python

Actualiza el controlador para obtener nuevas funciones y soluciones.

pip install --upgrade mssql-python

Consulta las notas de lanzamiento para ver si hay cambios repentinos antes de actualizar los sistemas de producción.

Plan de desarrollo

Para próximas funciones y la hoja de ruta de desarrollo, consulta el repositorio de GitHub.