Source code for sqlalchemy_jdbcapi.dialects.odbc_mssql
"""
Microsoft SQL Server ODBC dialect for SQLAlchemy.
Provides SQL Server database support via ODBC.
"""
from __future__ import annotations
import logging
from typing import Any
from sqlalchemy.dialects.mssql import base as mssql_base
from .odbc_base import ODBCDialect
logger = logging.getLogger(__name__)
[docs]
class MSSQLODBCDialect(ODBCDialect, mssql_base.MSDialect):
"""
Microsoft SQL Server ODBC dialect.
Supports SQL Server via ODBC using the Microsoft ODBC Driver for SQL Server.
Recommended ODBC Driver:
- ODBC Driver 18 for SQL Server (latest)
- ODBC Driver 17 for SQL Server
- Download: https://learn.microsoft.com/en-us/sql/connect/odbc/download-odbc-driver-for-sql-server
Connection URL:
odbcapi+mssql://user:password@host:1433/database
odbcapi+sqlserver://user:password@host:1433/database (alias)
Features:
- Full T-SQL support
- Window functions
- CTEs (Common Table Expressions)
- JSON support (SQL Server 2016+)
- Sequence support (SQL Server 2012+)
"""
name = "mssql"
driver = "odbcapi+mssql"
# ODBC driver name for SQL Server
pyodbc_driver_name = "ODBC Driver 18 for SQL Server"
default_schema_name = "dbo"
supports_sequences = True # SQL Server 2012+
supports_native_boolean = False # Use BIT instead
[docs]
@classmethod
def import_dbapi(cls) -> Any:
"""Import pyodbc module."""
import pyodbc
return pyodbc
def _get_server_version_info(self, connection: Any) -> tuple[int, ...]:
"""Get SQL Server version."""
cursor = connection.connection.cursor()
try:
cursor.execute("SELECT SERVERPROPERTY('ProductVersion')")
version_string = cursor.fetchone()[0]
# Parse version like "15.0.2000.5"
version_parts = version_string.split(".")
return tuple(int(p) for p in version_parts[:2])
finally:
cursor.close()