Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
mssql-python carga uno de dos proveedores ODBC nativos:
| Provider | ¿Qué es? | Status |
|---|---|---|
msodbcsql18 |
Microsoft ODBC Driver 18 para SQL Server, el controlador C++ establecido | Por defecto, sin cambios |
mssql-odbc |
Un nuevo controlador ODBC escrito en Rust | Versión preliminar, participación voluntaria |
Este artículo cubre mssql-odbcla 0.3.0, la versión actualmente utilizada por mssql-python, y en qué se diferencia de msodbcsql18.
Note
mssql-odbc está en desarrollo y validación activa. Aún no es un reemplazo completo del controlador ODBC 18 de Microsoft. Mantén msodbcsql18 como predeterminado de producción por ahora. El equipo de desarrollo planea cerrar las carencias de la versión preliminar en próximas versiones, salvo por exclusiones intencionadas explícitamente identificadas en este artículo.
Availability
El driver se distribuye dentro del paquete mssql-python-rs como wheels preconstruidas para CPython 3.10 y posteriores:
| Platform | Architectures |
|---|---|
| Windows | x64; ARM64 en CPython 3.11+ |
| macOS | universal2 (x86_64 + arm64), macOS 15 o posterior |
| Linux (glibc) | x86_64, aarch64 — manylinux_2_28 y manylinux_2_34 |
| Linux (musl) | x86_64, aarch64 — musllinux_1_2 |
Habilitación del controlador
El mssql-python paquete depende de mssql-python-rs, así que una instalación normal trae consigo el controlador de Rust:
pip install mssql-python
Si instalas con --no-deps o desde un índice privado, instala mssql-python-rs también explícitamente.
Selecciona el proveedor antes de la primera conexión, ya sea con una variable de entorno:
PowerShell:
$env:MSSQL_PYTHON_NATIVE_PROVIDER = "mssql-odbc"
Bash o Zsh:
export MSSQL_PYTHON_NATIVE_PROVIDER=mssql-odbc
o de Python:
import mssql_python
mssql_python.native_provider = "mssql-odbc"
Conéctate usando la cadena de conexión existente de tu aplicación. Mantén activada la validación de certificados (Encrypt=yes;TrustServerCertificate=no). Para autenticación y configuración de certificados, consulte Cadenas de conexión y Cifrado y certificados.
connection = mssql_python.connect(connection_string)
El controlador aplica estas reglas al seleccionar el proveedor:
- La
MSSQL_PYTHON_NATIVE_PROVIDERvariable de entorno tiene precedencia sobrenative_provider. Una asignación de atributos en conflicto emiteRuntimeWarning. - La selección se fija tras la validación de la cadena de conexión e inmediatamente antes de que se establezca la conexión nativa. Un fallo de conexión posterior no elimina la selección. Un error anterior de análisis de cadena de conexión o un paquete de proveedor faltante no soluciona la selección. Una vez fijada la selección, cambiar
native_providera otro proveedor emiteRuntimeWarningy no tiene efecto. Reinicia el proceso para cambiar entre proveedores. - Un nombre de proveedor no reconocido genera
ValueError; el controlador no recurre al proveedor predeterminado. Un nombre desconocido asignado anative_providerprovoca un error de inmediato. Un nombre desconocido en la variable de entorno genera un error al intentar conectarse. - Establece
native_providerenNonepara borrar la selección de atributos antes de que se fije. La variable de entorno sigue teniendo prioridad.
Llama mssql_python.get_native_provider_info() para inspeccionar el proveedor seleccionado, la fuente de selección y si la selección está fija. Antes de conectarse, esto informa de la selección, no de que el controlador nativo se haya cargado correctamente.
Para volver, pon la variable en msodbcsql18, o desconfigúrala y elimina cualquier asignación de native_provider de tu código (o ponla en "msodbcsql18").
Luego reinicia el proceso.
Lo que funciona hoy en día
El controlador mssql-odbc implementa todas las funciones ODBC a las que llama mssql-python, por lo que la mayoría de las aplicaciones pueden cambiar de proveedor sin cambios en el código. Consulta los problemas conocidos para ver las diferencias restantes.
| Area | Notes |
|---|---|
| Ciclo de vida de la conexión | Conectar, close()bloqueswith, tiempo de espera de inicio de sesión, diagnósticos y cambiar la base de datos actual. Los ajustes de la cadena de conexión incluyen ApplicationIntent, MultiSubnetFailover, IpAddressPreference, PacketSize, KeepAlive, y ConnectRetryCount / ConnectRetryInterval (resiliencia de conexión inactiva). |
| Authentication | Autenticación SQL (UID / PWD); autenticación de Windows (Trusted_Connection=Yes, mediante SSPI en Windows o Kerberos en Linux y macOS); y Microsoft Entra interactiva, código de dispositivo, entidad de servicio, identidad administrada, credencial predeterminada y token de acceso. No se admiten la autenticación integrada de Entra y la autenticación con contraseña; ver Problemas conocidos. |
| TLS |
Encrypt, TrustServerCertificate, HostnameInCertificate y ServerCertificate. |
| Ejecución de la consulta | Ejecución directa y preparada, reutilización de planes preparados, parámetros qmark y la conversión mssql-python que realiza pyformat. |
| Sintaxis de escape ODBC | Formas de función, fecha/hora, unión externa, GUID, LIKE ... {escape ...}, intervalo y {encrypt ...} de escape. |
| Procedimientos almacenados | Llámalas con T-SQL o con la sintaxis posicional {call ...} hasta execute(), lee los conjuntos de resultados y avanza con nextset(). |
| Parámetros de entrada | Parámetros escalares, SQL NULL, setinputsizes(), y parámetros mixtos regulares/streaming. |
| Parámetros grandes | Los grandes parámetros de texto y binarios fluyen al servidor por la ruta de enlace ordinaria; A continuación se enumeran las limitaciones de parámetros XML y UDT. |
executemany() |
Agrupado con arrays de parámetros ODBC. Las filas que contienen valores transmitidos recurren a la ejecución fila por fila. |
| Recuperación de filas |
fetchone(), fetchmany(), fetchall(), iteración, fetchval(), conversión tipada y transmisión de texto/binario de gran tamaño. |
| Recuperación con flecha |
arrow_batch(), arrow()y arrow_reader(). Se requiere pyarrow. |
| Varios conjuntos de resultados |
nextset(), incluyendo resultados producidos por matrices de parámetros. |
| Transactions | Autocommit, commit, rollback, la confirmación automática (o reversión, si se ha producido un error) que tiene lugar cuando finaliza un bloque with connect(...), y los niveles de aislamiento read-uncommitted, read-committed, repeatable-read, serializable y snapshot. |
| Tiempo de espera de consulta | Establece Connection.timeout (en segundos) como límite para las instrucciones ejecutadas por los cursores de esa conexión; al caducar, se genera un OperationalError.
0 significa que no hay tiempo de espera. Esta configuración es independiente del tiempo de espera de inicio de sesión especificado como connect(timeout=...). |
| Agrupación de conexiones | El pool integradomssql-python, incluyendo el restablecimiento de la conexión al obtener una conexión del pool y pools separados según la identidad de Microsoft Entra. |
| API de metadatos |
tables(), columns(), primaryKeys(), foreignKeys(), statistics(), rowIdColumns(), rowVerColumns(), procedures()y getTypeInfo(). |
| Codificación y convertidores | Codificación y convertidores de salida por defecto de caracteres anchos. La decodificación personalizada de caracteres estrechos y la conversión de parámetros no Unicode tienen limitaciones listadas en Problemas conocidos. |
Tipos de datos
Puedes leer todos los tipos de datos de SQL Server, y el controlador admite todos los tipos de parámetros que mssql-python vincula. El controlador devuelve xml, json, y vector valores como str (vector como un array JSON), y tipos de CLR como geometry, geography, y hierarchyid como bytes. Para otros mapeos en Python, véase Mapeos de tipos de datos.
Para conocer las limitaciones específicas de cada tipo, consulte Problemas conocidos.
Problemas conocidos
Comprueba estas diferencias antes de migrar una carga de trabajo desde msodbcsql18.
| Problema | Details | Workaround |
|---|---|---|
| Autenticación integrada de Microsoft Entra |
Authentication=ActiveDirectoryIntegrated no es compatible. La autenticación de Windows (Trusted_Connection=Yes) no se ve afectada. |
Usa otro método de Microsoft Entra, o mantén msodbcsql18. |
| Autenticación de contraseña de Microsoft Entra |
Authentication=ActiveDirectoryPassword no es compatible y no está previsto ofrecer compatibilidad porque este método no puede satisfacer MFA. La autenticación SQL (UID / PWD) no se ve afectada. |
Utiliza otro método de Microsoft Entra, como un principal de servicio, identidad gestionada o token de acceso. |
attrs_before ajustes |
La autenticación, la intención de la aplicación y la conmutación por error multi-subred no pueden configurarse como atributos numéricos. Los atributos de la sentencia que no sean el tiempo de espera de la consulta son rechazados. | Utiliza las palabras clave equivalentes a la cadena de conexión. |
| Tiempo de espera de la operación de conexión |
set_attr(SQL_ATTR_CONNECTION_TIMEOUT, ...) acepta y almacena el valor, pero no impone un tiempo de espera en la versión 0.3.0. |
Utiliza connect(timeout=...) para el inicio de sesión y Connection.timeout para las instrucciones; ninguno de ellos es un plazo general para las operaciones de conexión. |
| Hosts con varias direcciones |
msodbcsql18 activa por defecto la Resolución IP de Red Transparente (TNIR); mssql-odbc no la soporta.
mssql-python rechaza la palabra clave TransparentNetworkIPResolution de la cadena de conexión con cualquiera de los dos proveedores. Sin MultiSubnetFailover=Yes, las direcciones se prueban una a una, por lo que una dirección inalcanzable puede retrasar la conexión. No se negocian el almacenamiento en caché de DNS asistido por el servidor ni el enrutamiento mejorado. |
Establece MultiSubnetFailover=Yes para los oyentes de grupos de disponibilidad y otros hosts con varias direcciones. |
| Fallos de DNS transitorios | Si falla una búsqueda de DNS, el controlador no recurre a la última dirección que funcionó correctamente. (#457) | Vuelva a intentar la conexión. |
| Clasificación de datos | No hay metadatos de clasificación de sensibilidad disponibles, y SQL_COPT_SS_DATACLASSIFICATION_VERSION (1400) no se soporta. |
Consulta sys.sensitivity_classifications. |
| Multithreading | El uso multihilo no ha sido validado. | Mantén msodbcsql18 para cargas de trabajo multihilo. |
fork() Después de conectarse |
En Linux, un proceso bifurcado después de que el padre se haya conectado puede quedarse colgado cuando usa el controlador, incluso con una nueva conexión. Con la agrupación activada, el proceso padre también puede colgarse. (#566) | Utiliza el método de inicio spawn y conéctate dentro de cada worker. |
| Cancelación de una instrucción en ejecución | Una consulta o búsqueda en ejecución no puede ser interrumpida. Por ejemplo, cerrar an arrow_reader() no detiene una lectura en curso en otro hilo. |
Utilice Connection.timeout para limitar las instrucciones de larga duración. |
| Resultados no leídos | Cerrar un cursor o ejecutar otra instrucción lee y descarta los resultados restantes en lugar de cancelarlos, lo cual puede ser lento. Cerrar un cursor que usó una instrucción preparada ignora Connection.timeout y puede colgarse si el servidor deja de responder. (#546) |
Busca solo las filas que necesitas, por ejemplo con TOP. |
Parámetros grandes xml y UDT |
Los valores vinculados como SQL_SS_XML o SQL_SS_UDT a través de setinputsizes() se almacenan en memoria en lugar de procesarse por streaming. |
Asigne valores a xml como cadenas normales. |
Valores vacíos image |
Se devuelve un valor de SQL Server image vacío y no NULL como None en lugar de b"". |
Lee CAST(image_column AS varbinary(max)), o utiliza msodbcsql18 cuando la distinción entre vacío y NULO importa. |
| Parámetros de cadena que no son Unicode | Las cadenas asignadas como char / varchar hasta setinputsizes() pueden codificarse incorrectamente para las colaciones de página de códigos 437, 850 y UTF-8. |
Utilice la asignación de cadenas predeterminada. |
| Decodificación de páginas de código heredadas en Windows | Con setdecoding(SQL_CHAR, encoding="cp1252") o otra página de códigos heredada, el texto puede decodificarse incorrectamente o devolverse como bytes, porque el controlador devuelve los datos char / varchar como UTF-8. |
Usa el valor por defecto: conn.setdecoding(mssql_python.SQL_CHAR). |
Connection.getinfo() |
SQL_USER_NAME devuelve la cadena UIDde conexión, no el usuario de la base de datos. Está vacío cuando ningún UID llega al controlador. Algunos valores de capacidad y límites basados en el tamaño del paquete difieren de msodbcsql18. |
Utilice SELECT USER_NAME() para el usuario de la base de datos. |
| Fallos por falta de memoria | Algunos errores de asignación del controlador finalizan el proceso de Python en lugar de generar un MemoryError. (#484) |
Limita el tamaño de los valores que envías y recuperas. |
| Rendimiento de lectura de valores grandes | En un benchmark, las lecturas fragmentadas de datos varchar(max) / nvarchar(max) fueron ligeramente más lentas que con msodbcsql18. (#473) |
Realice pruebas de rendimiento de su carga de trabajo. |
Esta lista no es exhaustiva.
Informar de problemas
Si te encuentras con un error, selecciona msodbcsql18, reinicia el proceso y comprueba si el comportamiento sigue ocurriendo. También elimina cualquier asignación conflictiva de proveedor del lado de Python. La comparación ayuda a aislar el problema; no demuestra por sí sola su causa. Incluye la salida de mssql_python.get_native_provider_info(), tu plataforma y el SQL fallido o el mensaje de error:
- Problemas con el controlador de Rust: https://github.com/microsoft/mssql-rs/issues
-
mssql-pythonProblemas: https://github.com/microsoft/mssql-python/issues
Para el diagnóstico de Rust-driver, establece estas variables antes de iniciar Python y reproduce el problema con mssql-odbc seleccionado. Por ejemplo, en PowerShell:
$env:MSSQL_TDS_TRACE = "true"
$env:MSSQL_TDS_TRACE_LEVEL = "warn,mssqlodbc=debug"
$env:MSSQL_TDS_TRACE_DIR = "./traces"
MSSQL_TDS_TRACE Activa el trazado, MSSQL_TDS_TRACE_LEVEL selecciona el filtro de registro y MSSQL_TDS_TRACE_DIR escribe archivos por proceso en lugar de stderr.
Reinicia Python después de cambiar estos ajustes. Las trazas pueden contener texto SQL y valores de parámetros. Revisa y oculta los datos sensibles antes de compartir extractos relevantes, y desactiva el rastreo tras el diagnóstico.