本文列出了在SQL Server、Azure SQL 数据库、Azure SQL 托管实例和Microsoft Fabric中的SQL数据库中使用后端时的mssql-django限制。
Django 功能的限制
以下Django功能不支持或支持有限 mssql-django :
| 功能 / 特点 | 地位 | 详细信息 |
|---|---|---|
Avg 与 DurationField |
不支持 | 聚合 Avg 在 上不起作用 DurationField。 |
__regex 以及 __iregex 查找 |
需要设置 | 在SQL Server或Azure SQL 托管实例安装CLR汇编后才得到支持。 Azure SQL 数据库不支持 CLR assemblys。 参见 设置正则表达式查询。 |
DISTINCT ON |
不支持 | SQL Server不支持DISTINCT ON从句。 使用 .values().distinct() 或子查询。 |
Subquery 在 ORDER BY 中 |
不支持 | 按子查询表达式排序可能不起作用。 |
数据库层面 CASCADE |
有限 | 有些 SET NULL 操作 SET DEFAULT 可能需要手动迁移SQL。 |
is_dst 在 Trunc/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_VALUE、 LAST_VALUE或子查询。 |
ignore_conflicts 在 bulk_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 冲突 |
某些约束操作可能会冲突。 分开申请。 |
| 日期提取操作 |
ExtractYear, ExtractMonth以及类似操作的支持有限 tzinfo 。 |
JSONField 限制
-
mssql-djangoJSONField映射到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. 以外的模式,固定FA001了Authentication=。 已固定 KeyError 在子 DatabaseWrapper 职业(1.7.1的回归)。 |
| 1.7.2 | 固定时区处理 datetimeoffset 和 Now() 。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__iregexand 查找功能在 Azure SQL 数据库 上不可用。 - 连接用户必须拥有
sysadmin或ALTER SETTINGS许可。 管理命令会自动启用CLR。 -
mssql应用必须在INSTALLED_APPS。
安装CLR组件
运行管理命令,传递你的数据库名称:
python manage.py install_regex_clr <your-database-name>
该命令执行以下步骤:
- 如果服务器上还没启用,则启用 (
sp_configure 'clr enabled', 1) 的 CLR。 - Sets
clr strict securityto0(SQL Server 2017+ 上的汇编必须SAFE使用)。 - 从捆绑的DLL创建
regex_clr汇编。 - 创建
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 命令。 如果数据库被丢弃并重新创建(例如测试时),请再次执行该命令。