白杨商业智能工作室
#技术分享#SQL Server

mssql-django 1.7.2 发布:时区处理终于修好了,Django + SQL Server 用户必升

· 白杨BI工作室

mssql-django 1.7.2 是一个小版本补丁,但修了三个非常实用的 Bug:时区处理、explain() 报错、异常吞没。如果你是 Django + SQL Server 技术栈的用户,尤其是用了 `DATETIMEOFFSET` 字段或 `USE_TZ=True`,建议尽快升级。

mssql-django 1.7.2 发布:时区处理终于修好了,Django + SQL Server 用户必升

一句话总结

mssql-django 1.7.2 是一个小版本补丁,但修了三个非常实用的 Bug:时区处理、explain() 报错、异常吞没。如果你是 Django + SQL Server 技术栈的用户,尤其是用了 DATETIMEOFFSET 字段或 USE_TZ=True,建议尽快升级。


为什么要关注这个版本?

国内不少企业用 Django 做后端,数据库选 SQL Server — 尤其是制造业、金融、政务这些领域,SQL Server 绑定 Windows 生态,很多时候没得选。但 mssql-django 这个 ORM 适配层一直有些「可以忍但很烦」的小问题,其中时区处理就是投诉最多的一个。1.7.2 终于把这些问题修了。


三个核心修复

1. DATETIMEOFFSET 时区处理终于正确了 🔥

这是本次更新最重要的修复。

之前的问题: 当你从 SQL Server 的 DATETIMEOFFSET 字段读取数据时,mssql-django 会丢失时区偏移信息。比如你存了一个 2026-05-22 17:00:00 +08:00,读出来时变成 naive datetime(没有时区信息),或者时区直接错了。

带来的坑: 如果你的 Django 配置了 USE_TZ=True,用户的时区是北京时间,但 SQL Server 部署在 UTC 时区,那时间会偏移 8 小时 — 你存的「下午 5 点」用户看到「上午 9 点」。

1.7.2 的修复:

  • handle_datetimeoffset 现在正确解析 SQL Server 二进制 DATETIMEOFFSET 的偏移量,返回带时区的 datetime 对象
  • Now() 在 USE_TZ=True 时编译为 SYSDATETIMEOFFSET() 而不是 SYSDATETIME(),自带时区信息

这个补丁覆盖了 UTC、+05:30(印度)、-05:00(北美东部)、-09:30(马克萨斯群岛)、+05:45(尼泊尔)等多个时区的回归测试。

💡 国内用户注意: 如果你用 Django + SQL Server 做多时区业务(比如海外分公司的订单时间),升级后之前手动加 tzinfo 的 workaround 可以删掉了,ORM 层面已经是 timezone-aware 了。


2. QuerySet.explain() 不再报错 ✅

Django 4.0 内部把 query.explain_format / query.explain_options 合并成了 query.explain_info,但 mssql-django 的编译器还在读旧属性,导致任何调用 .explain() 的操作都直接抛 AttributeError。

1.7.2 根据 Django 版本自动读取正确的属性,现在 explain() 在 Django 4.0 到 6.0 全版本都恢复正常。

做 SQL 调优时 explain() 是常用工具,这个修复对日常开发排查慢查询很实用。


3. 测试工具不再吞异常 🐛

_check_jsonfield_supported_sqlite() 的 finally 块里有个 return 语句,会把包括 KeyboardInterrupt 在内的所有异常都吞掉。这个坑很小,但在调试阶段可能让你一脸懵。移除后异常正常传播。


版本兼容性

| 组件 | 支持版本 | |------|----------| | Django | 3.2 ~ 6.0 | | Python | 3.8 ~ 3.14 | | SQL Server | 2017 / 2019 / 2022 / 2025 / Azure SQL | | ODBC Driver | 17 或 18(默认 18,没装自动回退 17) |


升级指南

一行命令升级:

pip install --upgrade mssql-django

1.7.2 是 1.7.1 的原地替换,不需要改任何配置。

如果你的应用满足以下任一条件,升级后行为会直接变正确:

  • 从 DATETIMEOFFSET 列读取数据
  • 在 USE_TZ=True 下用 django.db.models.functions.Now()
  • 在 Django 4.0+ 上调用 QuerySet.explain()

⚠️ 注意: 如果你之前手动给 DATETIMEOFFSET 读取的 naive datetime 加过 tzinfo,升级后需要去掉这些 workaround,否则会重复加时区。


来源

  • 原文:Announcing mssql-django 1.7.2
  • 项目地址:https://github.com/microsoft/mssql-django
  • PyPI:https://pypi.org/project/mssql-django/

相关文章

微软重磅调整:Azure SQL弃用SGX加密意味着什么

微软重磅调整:Azure SQL弃用SGX加密意味着什么

微软 Azure SQL 数据库近日宣布,将正式停用基于英特尔 SGX 安全区域的 Always Encrypted 加密方案,这一变化标志着云端机密计算在数据库加密领域的一次重要技术路线调整。

#技术分享#Azure SQL
Azure SQL数据库中心性能监控来了,你的数据库终于有救了

Azure SQL数据库中心性能监控来了,你的数据库终于有救了

微软近日宣布,Azure SQL 数据库中心(Database Hub)的性能监控功能正式进入公共预览阶段,用户现可在统一门户中直接查看数据库运行指标,无需在多套工具间来回切换。

#技术分享#Azure SQL
微软Fabric数据库中心公共预览开放,数据开发迎来巨变

微软Fabric数据库中心公共预览开放,数据开发迎来巨变

数据库管理正在从被动运维走向主动洞察。微软近日宣布,Fabric 中的数据库中心(Database Hub)正式进入公共预览阶段,这项新能力将数据库运行信号转化为可执行的引导式操作,让数据资产的管理者第一次拥有了驾驶舱式的全局视野。

#技术分享#Azure SQL
SQL Server Always On终于支持多数据库MI链接了

SQL Server Always On终于支持多数据库MI链接了

微软近日宣布,Azure SQL 托管实例(MI Link)现已支持在 SQL Server 的 Always On 可用性组中同时连接多个数据库,该功能目前处于预览阶段。这意味着企业可以在混合云架构下,更灵活地实现多数据库的云端灾备与只读分流。

#技术分享#Azure SQL
Azure SQL数据库无服务器也能自动暂停?省钱大招来了

Azure SQL数据库无服务器也能自动暂停?省钱大招来了

微软近日宣布,Azure SQL 数据库的超大规模无服务器版本正式进入自动暂停与自动恢复功能的公开预览阶段。这意味着企业可以在业务低谷期让数据库自动休眠,在请求到来时秒级唤醒,从根本上重构云数据库的成本模型。

#技术分享#Azure SQL
SQL数据同步退役倒计时,你的数据库迁移方案准备好了吗

SQL数据同步退役倒计时,你的数据库迁移方案准备好了吗

微软近日宣布,Azure SQL 数据同步服务(SQL Data Sync)正式进入退役的最后阶段,该服务将不再支持新的同步组创建,现有用户需尽快迁移至替代方案。 - 停止新建同步组:用户已无法通过门户或 API 创建新的数据同步组,现有同步组仍可运行,但不再获得功能更新。

#技术分享#Azure SQL
有问题?加企业微信 1 对 1 交流 👇
➕ 添加企业微信
备注「白杨」优先通过 · 数据洞察与智能决策
企业微信
企业微信
备注「白杨」优先通过