Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье приводятся ограничения 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 запросы. См. раздел «Настройка производительности » для решений.
Ограничения по оптовым операциям
-
bulk_createНеreturn_rows_bulk_insert=Falseвозвращает удостоверения личности. Требуется для таблиц с триггерами. См. раздел «Массовые операции» с mssql-django.
Ограничения тестовой структуры
--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>
Эта команда выполняет следующие шаги:
- Включает CLR на сервере (
sp_configure 'clr enabled', 1), если он ещё не включён. - Устанавливает
clr strict securityв0(требуется дляSAFEассемблеров на SQL Server 2017+). - Создаёт
regex_clrсборку из комплектированного DLL. - Создаёт
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 один раз на каждую базу данных. Если база данных отбрасывается и воссоздаётся заново (например, во время тестирования), выполните команду снова.