mssql-django 中的限制和未受支持的功能

本文列出了在SQL Server、Azure SQL 数据库、Azure SQL 托管实例和Microsoft Fabric中的SQL数据库中使用后端时的mssql-django限制。

Django 功能的限制

以下Django功能不支持或支持有限 mssql-django

功能 / 特点 地位 详细信息
AvgDurationField 不支持 聚合 Avg 在 上不起作用 DurationField
__regex 以及 __iregex 查找 需要设置 在SQL Server或Azure SQL 托管实例安装CLR汇编后才得到支持。 Azure SQL 数据库不支持 CLR assemblys。 参见 设置正则表达式查询
DISTINCT ON 不支持 SQL Server不支持DISTINCT ON从句。 使用 .values().distinct() 或子查询。
SubqueryORDER BY 不支持 按子查询表达式排序可能不起作用。
数据库层面 CASCADE 有限 有些 SET NULL 操作 SET DEFAULT 可能需要手动迁移SQL。
is_dstTrunc/Extract 不支持 is_dst参数(用于解决夏令时过渡期间的模糊时间)在中Extract()Trunc()且不被支持。 在原始SQL中用于 AT TIME ZONE 支持DST的查询。
浮点注释 有限 由于 SQL Server 的浮点类型行为,浮点Avg聚合可能会比 PostgreSQL 更差。 例如,平均值0.1和0.2可能得到0.15000000000000000222,而不是恰好0.15。 用于DecimalFieldCast(avg_expr, output_field=DecimalField())或用于关键的财务计算。
注释/存在于 ORDER BY 不支持 用注释或存在表达式可能 order_by 不行。
右手幂与日期时间算术 不支持 右手幂运算(例如, F('value') ** 2 能用但 2 ** F('value') 失败)和除 timedelta 法不被支持。
时区与时差 有限 时区和时差并不完全支持。 参见 mssql-django 中的时区支持
NthValue 窗口函数 不支持 SQL Server不支持 NTH_VALUE()。 使用 FIRST_VALUELAST_VALUE或子查询。
ignore_conflictsbulk_create 不支持 不支持 bulk_create(objs, ignore_conflicts=True)。 SQL Server 没有 PostgreSQL ON CONFLICT DO NOTHING的对应工具。
JSONField contains lookup 不支持 改用密钥路径查找(例如, filter(metadata__color="blue"))。 参见 JSONField 限制
select_for_update(of=(...)) 不支持 SQL Server不支持锁定特定表。 后端会加 NotSupportedError注。 参见 事务管理

迁移限制

限度 详细信息
祭坛 AutoField 无法将字段改为(列)或从(AutoFieldIDENTITY列)切换。 需要创建一个新的表。
用外键重命名 重命名带有外键约束的列可能会失败。 使用 SeparateDatabaseAndState
AddConstraint / RemoveConstraint 冲突 某些约束操作可能会冲突。 分开申请。
日期提取操作 ExtractYearExtractMonth以及类似操作的支持有限 tzinfo

JSONField 限制

  • mssql-django JSONField映射到Nvarchar(Max)。 SQL Server 2025引入了原生json类型,但Microsoft的SQL Server驱动没有暴露该类型。
  • contains查询功能不被支持。 改用密钥路径查找(例如, filter(metadata__color="blue"))。
  • 带引号的字符串值会返回带有额外的引号(例如, '"value"' 代替 'value')。
  • 有些嵌套查找的表现可能和PostgreSQL不同。
  • 更多信息请参见 SQL Server 中的 JSONField

InspectDB 局限性

  • 复合主键不会像现在那样 unique_together 自动生成。
  • 某些 SQL Server 特定的列类型可能会映射到通用的 Django 字段。
  • 手动审查并调整生成的模型。
  • 更多信息请参见 使用 inspectdb 的逆向工程模型

SQL Server 参数限制

SQL Server 限制每个查询最多 2,100 个参数。 这一限制影响了生成具有大量值列表的参数化查询的Django操作:

运算 如何达到极限
filter(field__in=large_list) 每个列表项目都变成了一个参数。 后端会自动将2048多个项目列表整理到临时表中。
prefetch_related() 每个父对象 ID 都成为相关查询 WHERE IN 子句中的一个参数。 自动优化,比如 filter(field__in=...) 超过2048个ID。
bulk_create() 每个物体的每个场都成为一个参数。 一个包含10个字段和250个对象的模型生成2500个参数。
bulk_update() 每个字段为每个对象使用两个参数(一个用于PK匹配,一个用于值)。
Q() 有许多条件 链状 Q 对象中的每个值都成为一个参数。

设置为 batch_size 批量操作和大 IN 块查询。 有关解决方案,请参见 性能调优

散装作业的限制

  • bulk_create 与 不 return_rows_bulk_insert=False 返回 ID。 对于带有触发器的表格,这是必需的。 参见 mssql-django 的批量操作

测试框架的局限性

--keepdb 在使用托管身份认证ActiveDirectoryMsi()时是必需的,因为测试运行者无法使用该认证方法创建或销毁数据库。

更多信息请参见使用 SQL Server 测试 Django 应用

版本专属注释

MSSQL-Django 版本 备注
1.7.3 对于除 ActiveDirectoryMsi. 以外的模式,固定FA001Authentication=。 已固定 KeyError 在子 DatabaseWrapper 职业(1.7.1的回归)。
1.7.2 固定时区处理 datetimeoffsetNow()USE_TZ=True 修复 .explain() 了Django 4.0及更高版本的兼容性。
1.7.1 Fabric 中的 SQL 数据库(EngineEdition 12)修复。 下降指标 AlterField 修正。
1.7 ODBC 驱动 18 是默认配置。 新增了Django 6.0,Python 3.14,SQL Server 2025支持。
1.6 支持Django 5.1和5.2。 增强了JSON功能。
1.5 修复AutoField、参数格式和模式查询的漏洞。
1.4 Django 5.0 支持。 db_comment 支持。
1.3 支持Django 4.2。
1.2 Django 4.1 支持。 时区支持。 return_rows_bulk_insert 选项。 支持SQL Server 2022。
1.1 支持Django 3.2和4.0。

Django 版本专属注释

Django 版本 备注
5.1 inspectdb 可以检查带有复合主键的表,但无法生成完整的模型定义。
5.2 CompositePrimaryKey 支持是部分的。 inspectdb 仍然需要手动修复,元组与子查询的比较需要Django 5.2.4及更高版本,还有一些迁移以及JSONField的批量/CASE WHEN,更新路径仍然存在测试排除。 更多信息请参见 GitHub 仓库
6.0 需要 Python 3.12 及更高版本。 所有5.2的限制都适用。 后端透明地处理所有6.0 API的变更。

设置正则表达式查找

mssql-django后端支持 Django __regex__iregex查找,但需要一次性设置步骤。 后端会附带一个CLR汇编(regex_clr.dll),为SQL Server提供dbo.REGEXP_LIKE一个函数。

先决条件

  • 一个支持CLR集成的SQL Server实例。 本地 SQL Server 和 Azure SQL 托管实例 支持 CLR。 Azure SQL 数据库不支持 CLR assemblys,所以 __regex__iregex and 查找功能在 Azure SQL 数据库 上不可用。
  • 连接用户必须拥有 sysadminALTER SETTINGS 许可。 管理命令会自动启用CLR。
  • mssql应用必须在 INSTALLED_APPS

安装CLR组件

运行管理命令,传递你的数据库名称:

python manage.py install_regex_clr <your-database-name>

该命令执行以下步骤:

  1. 如果服务器上还没启用,则启用 (sp_configure 'clr enabled', 1) 的 CLR。
  2. Sets clr strict security to 0 (SQL Server 2017+ 上的汇编必须SAFE使用)。
  3. 从捆绑的DLL创建 regex_clr 汇编。
  4. 创建 dbo.REGEXP_LIKE 标量函数。

注意

设置为 clr strict security0 允许未签名的 CLR 组件加载。 这是必须的,因为捆 regex_clr.dll 绑包没有签名。 在生产服务器上运行命令前,先和你的DBA讨论这个变更。 该设置适用于服务器范围,而非单个数据库。

使用正则表达式查找

安装汇编后,使用 __regex__iregex 在查询集中:

# Case-sensitive regex
products = Product.objects.filter(name__regex=r"^Widget \d+$")

# Case-insensitive regex
products = Product.objects.filter(name__iregex=r"^widget \d+$")

后端将这些查找 dbo.REGEXP_LIKE(column, pattern, case_flag) = 1转换为 。

Note

你必须在每个数据库中执行一次该 install_regex_clr 命令。 如果数据库被丢弃并重新创建(例如测试时),请再次执行该命令。