一句话总结
mssql-python 1.7.1 是一个以 Bug 修复和性能优化为主的小版本,但这次发布比预期坎坷得多 —— PyPI 存储空间满了,差点发不出去。如果你的 Python 项目用 mssql-python 连 SQL Server,这个版本值得关注。
先搞清楚:mssql-python 是啥?
很多国内开发者对 mssql-django(Django 的 SQL Server 后端)比较熟,但 mssql-python 是更底层的东西 —— 它是微软官方的 Python SQL Server 驱动,对标 pyodbc 但性能更好、API 更 Pythonic。简单说:
| 库 | 定位 | |---|---| | mssql-python | 官方 Python 驱动,直接调 ODBC,纯性能向 | | pyodbc | 社区驱动,通用 ODBC 封装 | | mssql-django | Django ORM 适配层,底层可能用 mssql-python |
💡 如果你的 ETL 脚本、数据分析管道、AI 应用直接用 Python 连 SQL Server,mssql-python 是目前官方推荐的方案。
1.7.1 核心更新
🔥 性能优化
-
UTF-16 字符串处理改用 simdutf + std::u16string 之前每次 Python 和驱动之间传字符串都会做编码转换,开销不小。1.7.1 用 simdutf(SIMD 加速的 Unicode 库)替代了旧逻辑,每次字符串往返的性能都有提升。
-
execute() 热路径加速 通过软重置、预处理语句缓存和按需诊断,把
execute()的调用开销进一步压低了。高频调用场景(比如批量插入)收益明显。
🐛 6 个关键 Bug 修复
1. SSH 隧道不再挂起(issue #532)
这是社区反馈最集中的问题。很多企业用 paramiko + sshtunnel 建立 SSH 隧道连远程 SQL Server,但 mssql-python 在连接时会持有 GIL(全局解释器锁),导致 SSH 隧道线程无法工作,connect() 直接卡死。1.7.1 在 SQLSetConnectAttr 调用期间释放了 GIL,SSH 隧道场景恢复正常。
💡 国内不少企业为了安全,数据库不直接暴露公网,通过跳板机 SSH 隧道连接是常见做法。这个修复对这类场景是刚需。
2. 登录失败现在抛正确的异常
之前密码错误、账号不存在等登录失败直接抛 RuntimeError,1.7.1 改为抛 mssql_python.Error,更符合 Python 异常体系的预期,try/except 可以精确捕获了。
3. executemany 不再因小数符号变化报错(issue #557)
批量插入时,如果前一行是 1.5 后一行是 1,5(欧洲格式),会抛出 RuntimeError。修复后正确处理了不同行的 decimal 格式差异。
4. VARCHAR 编码一致性:Windows 和 Linux 输出一致了(issue #468)
CP1252 编码的 VARCHAR 字段在不同平台返回值不一样 —— Windows 上正常,Linux 上可能是乱码。1.7.1 统一了跨平台的编码处理。
如果你们的 SQL Server 有历史遗留的 Latin 编码数据,跑在 Linux ETL 服务器上终于不会再出现乱码了。
5. manylinux_2_28 构建目标
RHEL 8 / CentOS 8 用户现在可以直接拿 wheel 安装,不用再本地编译了。
6. macOS Python 3.10 universal2 wheel 修复
Apple Silicon 用户之前可能拿到的是 x86_64 wheel 走 Rosetta 翻译,现在是原生 ARM64。
PyPI 容量危机:「缺失的兆字节」
这次发布最有意思的部分在这里:1.7.0 版本因为 PyPI 存储配额耗尽被拒绝了。
为什么会满?
mssql-python 跟普通的纯 Python 包不一样 —— 它每个 wheel 都内嵌了 ODBC 驱动二进制文件,而且每个 wheel 都很大。支持的矩阵是:
Windows: x64 / ARM64 / x86
macOS: universal2
Linux: manylinux x86_64 / aarch64 | musllinux x86_64 / aarch64
Python: 3.9 ~ 3.14
每个组合一个 wheel,每个 release 都会保留在 PyPI 上。几十个 release 堆下来,总大小直接撞上 PyPI 的项目存储上限。
短期措施:断舍离
为了把 1.7.1 发出去,团队清理了 PyPI 上的旧包:
- ❌ 所有 1.0.0-alpha 版本
- ❌ 所有 1.x.x-beta 版本
- ❌ 已经传上去但被配额卡住的 1.7.0
老用户如果 pin 在 alpha/beta 版本上,需要升级到最新 GA:
pip install -U mssql-python
长期方案:拆分部署
清理旧包只是缓兵之计,团队正在从两个方向解决根本问题:
-
拆分 wheel 结构 — 把 ODBC 驱动二进制从主 wheel 中分离出去,让每个平台的安装包大幅缩小。目标是
pip install mssql-python仍然一行搞定,但磁盘和 PyPI 占用缩小到现在的几分之一。 -
申请 PyPI 提高配额 — 这是常规操作,给赶时间的长远方案腾缓冲期。
🔍 这个 PyPI 容量问题其实是开源基础设施的一个有趣案例:当你的包本身是「基础设施的分发包」(自带原生二进制),PyPI 的存储模型就不够用了。node-sass、TensorFlow 等包也遇到过类似困境。
升级指南
pip install -U mssql-python
没有破坏性变更,直接原地升级即可。如果你之前 pin 了 alpha/beta 版本,确认代码兼容性后切到 ^1.7 即可。
有任何问题直接去 GitHub Issues 提 —— 团队承诺逐条回复。
版本兼容性
| 组件 | 支持版本 | |---|---| | Python | 3.9 ~ 3.14 | | SQL Server | 2017 / 2019 / 2022 / 2025 / Azure SQL | | ODBC Driver | 17 或 18 | | 平台 | Windows / macOS / Linux (glibc & musl) |
📌 原文链接:https://techcommunity.microsoft.com/t5/sql-server-blog/mssql-python-1-7-1-and-the-case-of-the-missing-megabytes/ba-p/4521991 📅 发布日期:2026-05-21


