本文介绍 Django 数据库后端的每个版本中的 mssql-django 新功能、改进和更改。
版本 1.7.4
上映日期:2026年7月
1.7.4 版本是一个向后兼容的补丁版本,包含两个针对原始和带注释的 GROUP BY 查询处理的修复。
故障修复
-
IndexError在含有转义的%%和实际参数的GROUP BY查询上:此前,任何带有GROUP BY子句的查询都会经过一个占位符改写步骤,该步骤会匹配%\w+并将其替换为{}。 该正则表达式还会匹配被转义的%%字面量,这会注入虚假的占位符,并且每当查询将%%转义与真实的%s参数组合在一起时,就会触发IndexError: Replacement index N out of range。 收窄后的正则表达式现在只会处理%%(按原样保留)和%s(真正的占位符),这也是编译器唯一会输出的模式。 同样的修复还防止了另一个无关的静默错误:在无参数查询中,像LIKE '%abc%'这样未转义的模式会被改写为LIKE '{}%',并返回错误的行。 -
NotImplementedError对于IntegerChoices原始查询:GROUP BY之前,将一个包含IntegerChoices子句的原始查询传递GROUP BY值时,会引发NotImplementedError: Not supported type <enum ...>。 参数类型辅助函数采用了精确的类型检查(typ == int),而且type(IntegerChoices_value)是枚举类而不是int,因此该值最终进入了 raise 分支,尽管它是int的子类。 类型检查现在使用isinstance,分支bool在分支int之前被评估(因为bool本身是一个int子类)。 枚举选项现在可以正确绑定,bool仍然绑定BIT,普通的int保持不变。
版本 1.7.3
发布日期:2026 年 6 月
版本 1.7.3 是一个向后兼容的补丁版本,包含两项与连接和运行时相关的修复。
故障修复
-
FA001对于Authentication=以外的ActiveDirectoryMsi模式:以前,后端仅对Trusted_Connection=yes跳过ActiveDirectoryMsi。 其他未提供USER值的 Entra 模式(例如ActiveDirectoryIntegrated、ActiveDirectoryDefault、ActiveDirectoryDeviceFlow)仍会收到Trusted_Connection=yes,而 ODBC 驱动程序会以FA001(Cannot use Authentication option with Integrated Security option)拒绝该值。 该修复程序通过边界感知且不区分大小写的匹配方式检测任何显式的Authentication=值,并跳过Trusted_Connection和Integrated Security=SSPI。 密码处理保持不变:SqlPassword、ActiveDirectoryPassword和ActiveDirectoryServicePrincipal继续发送PWD,而ActiveDirectoryInteractive继续省略它。 -
子类化
KeyError上的DatabaseWrapper:缓存的sql_server_version和to_azure_sql_db属性依赖于type(self).__dict__的cached_property内省,这在KeyError子类首次访问它们时会引发DatabaseWrapper(1.7.1 版本引入的回归问题)。 修复使用通过_known_versions访问的显式类级别字典(_known_azures、self.),因此查找通过 MRO 解析,子类化包装器正常工作。
版本 1.7.2
发布日期:2026 年 5 月
版本 1.7.2 是一个向后兼容的补丁版本,包含时区和兼容性修复。
故障修复
-
.explain()Django 4.0 及更高版本的兼容性:修复了 Django 解释元数据的编译器处理,因此.explain()不再在AttributeErrorDjango 4.0 及更高版本中失败。 后端现在遵循符合相应版本的 explain 字段,并在需要时正确抛出NotSupportedError。 - datetimeoffset 时区处理:修复了 datetimeoffset 的解析问题,从而保留时区偏移量而不是将其丢弃。 返回的日期时间现在会在预期情况下包含时区信息。
-
Now()withUSE_TZ=True: 更新了 SQL 生成,以便在Now()启用时区支持时使用时区感知行为,从而阻止非 UTC SQL Server 主机上的时间戳偏移。
版本 1.7.1
发布日期:2026 年 4 月
版本 1.7.1 是一个向后兼容的补丁版本,包含错误修复。
故障修复
-
FieldDoesNotExist当以降序索引排序更改字段时:修复_alter_field()中使用schema.py而非index.fields_orders来解析索引字段名称的index.fields。 以前的代码将原始字段带排序字符串(例如"-pub_date")传递给model._meta.get_field(),这会引发FieldDoesNotExist。 现在仅提取字段名称,正确丢弃排序后缀。 -
支持 Microsoft Fabric 中的 SQL 数据库(EngineEdition 12):将 Fabric 中的 SQL 数据库(
EngineEdition=12)识别为 Azure 版本。 以前,Fabric 的引擎版本未被识别,导致to_azure_sql_db返回False且功能门控检查失败。 该修复将EDITION_AZURE_SQL_FABRIC=12添加到_AZURE_EDITIONS,并将 Fabric 映射到最新受支持的 SQL Server 版本。JSONField、哈希函数、排序规则内省和测试数据库拆卸在 Fabric 上现在正常工作。
版本 1.7
发布日期:2026 年 3 月
亮点
- Django 6.0 支持:与 Django 6.0 完全兼容,这需要Python 3.12 或更高版本。 后端以透明方式处理所有 6.0 API 更改。
-
部分
CompositePrimaryKey支持:后端添加了对 Django 5.2CompositePrimaryKey的部分支持。 元组与子查询的比较需要 Django 5.2.4 或更高版本,部分复合键和JSONField边缘情况仍然存在。 Django 5.2 本身首次在 mssql-django 1.6 中受支持。 - SQL Server 2025 支持:根据 SQL Server 2025 进行验证。
- ODBC 驱动程序 18 默认值:后端现在默认为 ODBC Driver 18 for SQL Server,如果未安装版本 18,则自动回退到 ODBC 驱动程序 17。
特定版本说明
| Django 版本 | 备注 |
|---|---|
| 姜戈5.1 |
inspectdb 可以检查具有复合主键的表,但不会为这些表生成完整的模型定义。 |
| Django 5.2 |
CompositePrimaryKey 仅提供部分支持。 元组与子查询的比较需要 Django 5.2.4 或更高版本,部分迁移和 JSONField 边缘情况仍然存在。 |
| 姜戈6.0 | 需要Python 3.12 或更高版本。 所有 5.2 限制都适用。 |
版本 1.6
发布日期:2025 年 8 月
- 添加了 Django 5.1 和 5.2 支持。
- 增强的 JSON 功能和向后兼容性。
- 改进了管道基础结构。
版本 1.5
发布日期:2024 年 4 月
- 为
supports_comments添加了db_comments功能标记。 -
AutoField、参数格式设置和架构查询的错误修复。
版本 1.4
发布日期:2024 年 1 月
- 添加了 Django 5.0 支持。
- 添加了
db_comment支持。 - 日期/时间转换和空聚合的错误修复。
版本 1.3
发布日期:2023 年 5 月
- 添加了 Django 4.2 支持。
- 新增了对大小写敏感
Replace函数的支持。 - 为
OFFSET处理和左填充的 Bug 修复。
版本 1.2
发布日期:2022 年 12 月
- 添加了 Django 4.1 支持。
- 添加了时区支持 (datetimeoffset with
USE_TZ=True) 。 - 新增了用于批量插入时检索 ID 的
return_rows_bulk_insert选项。 - 添加了 SQL Server 2022 支持。
- 新增了
JSONField对 Azure SQL 托管实例 的支持。
版本 1.1
发布日期:2022 年 7 月
- Django 3.2 和 4.0 支持。
- SQL Server 2016 及更高版本,以及Azure SQL 数据库支持。
- 基于
pyodbc的连接。