Ограничения и неподдерживаемые функции в mssql-django

В этой статье приводятся ограничения mssql-django бэкенда при использовании с SQL Server, База данных SQL Azure, Управляемый экземпляр SQL Azure и SQL Database в Microsoft Fabric.

Ограничения по функциям Django

Следующие функции Django не поддерживаются или имеют ограниченную поддержку бэкенда mssql-django :

Feature Статус Details
Avg с DurationField Не поддерживаются Агрегат Avg не работает на DurationField.
__regex и __iregex поисковые запросы Требуется настройка Поддерживается после установки ассемблера CLR на SQL Server или Управляемый экземпляр SQL Azure. База данных SQL Azure не поддерживает CLR-ассембли. См. Настроить поиск в регулярных выражениях.
DISTINCT ON Не поддерживаются SQL Server не поддерживает DISTINCT ON клаузы. Используйте .values().distinct() или отправляйте подзапросы.
Subquery в ORDER BY. Не поддерживаются Упорядочение по выражениям подзапроса может не сработать.
Уровень базы данных CASCADE Limited Некоторые SET NULL операции SET DEFAULT могут требовать ручной миграции SQL.
is_dst в Trunc/Extract Не поддерживаются is_dst параметр (используется для разрешения неоднозначных времен во время перехода на летнее время) в Extract() и Trunc() не поддерживается. Используйте AT TIME ZONE в исходном SQL для запросов с учётом цифрового времени (DST).
Аннотация с плавающей запятой Limited Агрегаты с плавающей запятой Avg могут терять точность по сравнению с PostgreSQL из-за поведения float type SQL Server. Например, среднее значение 0.1 и 0.2 может давать 0.15000000000000000222 вместо ровно 0.15. Используйте DecimalField или Cast(avg_expr, output_field=DecimalField()) для критически важных финансовых расчетов.
Аннотация/существует в ORDER BY Не поддерживаются Использование аннотаций или выражений order_by в может не сработать.
Арифметика степени правой руки и времени времени даты Не поддерживаются Правые силовые операции (например, F('value') ** 2 работает, но 2 ** F('value') не работают) и деление с timedelta не поддерживаются.
Часовые пояса и временные дельты Limited Часовые пояса и временные дельты полностью не поддерживаются. См. Поддержка часовых поясов в mssql-django.
NthValue Функция окна Не поддерживаются SQL Server не поддерживает NTH_VALUE(). Используйте FIRST_VALUE, LAST_VALUE, или подзапрос.
ignore_conflicts в bulk_create. Не поддерживаются bulk_create(objs, ignore_conflicts=True) не поддерживается. SQL Server не имеет аналога PostgreSQLON CONFLICT DO NOTHING.
Поиск в JSONField contains Не поддерживаются Используйте поиск по пути ключей (например, filter(metadata__color="blue")). См. ограничения JSONField.
select_for_update(of=(...)) Не поддерживаются SQL Server не поддерживает блокировку конкретных таблиц. Бэкенд повышает NotSupportedError. См. Управление транзакциями.

Ограничения миграции

Limitation Details
Альтер AutoField Нельзя изменить поле в или из AutoField (IDENTITY столбца). Требуется создание новой таблицы.
Переименование с внешними ключами Переименование столбца с ограничениями внешнего ключа может не получиться. Используйте SeparateDatabaseAndState.
AddConstraint / RemoveConstraint Конфликты Некоторые операции с ограничением могут конфликтовать. Подавайте заявки в отдельных миграциях.
Операции извлечения дат ExtractYear, ExtractMonth, и подобные операции имеют ограниченную tzinfo поддержку.

Ограничения JSONField

  • mssql-djangoКарты JSONField на Нварчар (макс). SQL Server 2025 представил нативный тип json, но драйвер Microsoft ODBC для SQL Server его не показывает.
  • contains Поиск не поддерживается. Используйте поиск по пути ключей (например, filter(metadata__color="blue")).
  • Цитируемые значения строк возвращаются с дополнительными кавычками (например, '"value"' вместо 'value').
  • Некоторые вложенные поиски могут вести себя иначе, чем в PostgreSQL.
  • Для получения дополнительной информации см. JSONField с SQL Server.

Ограничения inspectDB

  • Составные первичные ключи не генерируются так unique_together автоматически.
  • Некоторые типы столбцов, специфичные для SQL Server, могут соответствовать общим полям Django.
  • Проверяйте и корректируйте сгенерированные модели вручную.
  • Для получения дополнительной информации см. раздел Reverse-engineering models with inspectdb.

Ограничение параметров SQL Server

SQL Server ограничивает каждый запрос максимум 2 100 параметрами. Это ограничение затрагивает операции Django, которые генерируют параметризованные запросы с большими списками значений:

Операция Как он достигает предела
filter(field__in=large_list) Каждый элемент списка становится параметром. Бэкенд автоматически оптимизирует перечисление более 2048 элементов в временную таблицу.
prefetch_related() Каждый идентификатор родительского объекта становится параметром в клаузе соответствующего запроса WHERE IN . Автоматическая оптимизация, например filter(field__in=...) , когда более 2 048 ID.
bulk_create() Каждое поле каждого объекта становится параметром. Модель с 10 полями и 250 объектами генерирует 2 500 параметров.
bulk_update() Каждое поле использует два параметра на объект (один для совпадения PK, один для значения).
Q() с множеством условий Каждое значение в цепочных Q объектах становится параметром.

Назначайте batch_size массовые операции и разделяйте крупные IN запросы. См. раздел «Настройка производительности » для решений.

Ограничения по оптовым операциям

Ограничения тестовой структуры

--keepdb требуется при использовании управляемой идентификационной аутентификации (ActiveDirectoryMsi), поскольку тестовый раннер не может создавать или уничтожать базы данных с помощью этого метода аутентификации.

Для получения дополнительной информации см. Тест приложений Django с SQL Server.

Примечания по версии

Версия mssql-django Примечания
1.7.3 Исправлено FA001 для Authentication= режимов, кроме ActiveDirectoryMsi. Фиксировано KeyError на подклассе DatabaseWrapper (регрессия из 1.7.1).
1.7.2 Фиксированная обработка часовых поясов для смещения времени иNow() с USE_TZ=True. Исправлена .explain() совместимость с Django 4.0 и более поздними версиями.
1.7.1 Исправление SQL базы данных в Fabric (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

Версия Джанго Примечания
5.1 inspectdb Может инспектировать таблицы с составными первичными ключами, но не генерирует полные определения моделей для них.
5,2 CompositePrimaryKey Поддержка частичная. inspectdb всё ещё требуются ручные исправления, сравнение кортежей с подзапросами требует версий Django 5.2.4 и более поздних, а некоторые пути обновления для передвижения и JSONField bulk/CASE WHEN всё ещё имеют исключения тестов. Для получения дополнительной информации смотрите репозиторий GitHub.
6.0 Требуется Python 3.12 и более поздние версии. Действуют все ограничения 5.2. Бэкенд прозрачно обрабатывает все изменения API 6.0.

Настройте поиск в регулярных выражениях

mssql-django Бэкенд поддерживает Django __regex и __iregex поиски, но для этого требуется одноразовая настройка. Бэкенд поставляет CLR-ассемблер (regex_clr.dll), который предоставляет dbo.REGEXP_LIKE функцию SQL Server.

Необходимые условия

  • Экземпляр SQL Server, поддерживающий интеграцию с CLR. Локальные SQL Server и Управляемый экземпляр SQL Azure поддерживают CLR. База данных SQL Azure не поддерживает CLR-сборки, а __regex__iregex поиски недоступны в База данных SQL Azure.
  • Пользователь должен иметь sysadmin разрешение ALTER SETTINGS . Команда управления автоматически включает CLR.
  • mssql Приложение должно быть в INSTALLED_APPS.

Установка сборки CLR

Выполните команду управления, передав имя вашей базы данных:

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

Эта команда выполняет следующие шаги:

  1. Включает CLR на сервере (sp_configure 'clr enabled', 1), если он ещё не включён.
  2. Устанавливает clr strict security в 0 (требуется для SAFE ассемблеров на SQL Server 2017+).
  3. Создаёт regex_clr сборку из комплектированного DLL.
  4. Создаёт dbo.REGEXP_LIKE скалярную функцию.

Caution

Настройка clr strict security позволяет 0 загружать неподписанные 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 один раз на каждую базу данных. Если база данных отбрасывается и воссоздаётся заново (например, во время тестирования), выполните команду снова.