用途:为 Python 应用接入 Azure SQL 数据库提供驱动选型与连接方法,覆盖驱动选择、安装、连接字符串、连接池与 Microsoft Entra ID 认证。
驱动选择:mssql-python 1.13.0 为 Microsoft 一方驱动,需 Python 3.10 及以上,无需在操作系统安装 ODBC 驱动(mssql-python-odbc 自带驱动二进制),支持 Entra ActiveDirectoryDefault 并自带 azure-identity;pyodbc 5.3.0 为社区长期方案,需 Python 3.9 及以上,需按发行版安装 msodbcsql18 与驱动管理器,不支持 ActiveDirectoryDefault。新项目用 mssql-python;上层已依赖 pyodbc(如 SQLAlchemy、Django 等 ORM 方言)时保留 pyodbc,SQLAlchemy 相关配置另见 sqlalchemy-azure-sql,不必仅因换驱动重写数据访问层。
安装:mssql-python 用 pip install mssql-python;pyodbc 用 pip install pyodbc 并另行安装 ODBC 驱动。Python 3.9 上安装 mssql-python 会报 No matching distribution found。写 Dockerfile 或 CI 安装驱动前需注意许可提示、Alpine 无 Microsoft 包仓库、slim Debian 缺 libgssapi-krb5-2 三类失败。
连接:两者均使用 ODBC 风格关键字;mssql_python.connect() 不写 Driver,pyodbc 必须写出安装注册的驱动名。服务器、数据库与凭据应取自环境变量或密钥存储,查询值须绑定参数而非字符串拼接。
连接池:mssql-python 默认启用池,max_size 100、idle_timeout 600 秒,mssql_python.pooling() 必须在首次连接前调用一次,之后调用会被静默忽略;池键为连接字符串逐字节内容,建议做成常量。pyodbc 不在 Python 层池化,由 ODBC 层处理,pyodbc.pooling 默认 True,其上下文管理器退出时提交或回滚而不关闭,应 finally 中调用 close()。
Entra ID:mssql-python 设置 Authentication 关键字,本地用 ActiveDirectoryDefault,生产用 ActiveDirectoryMSI;凭据为 azure-identity 对象时可用 token_provider 传递。pyodbc 的 ODBC 驱动不接受 ActiveDirectoryDefault,需在 Python 中获取令牌后经 attrs_before 以 1256 属性传入:令牌为 UTF-16 小端并带四字节长度前缀,连接字符串不得含 UID、PWD、Authentication 或 Trusted_Connection。
自检:可用 python3 -c "import pyodbc; print(pyodbc.version, pyodbc.drivers())" 确认驱动名已注册;再用脚本查询 DB_NAME()、SUSER_SNAME()、USER_NAME() 与加密状态,期望 encrypted=TRUE。
限制:加密策略、重试与暂停库首次连接错误、池容量由 connect-to-azure-sql 负责;创建数据库主体见 entra-id-auth。原文未给出价格、平台支持范围或效果数据。