Ograniczenia i nieobsługiwane funkcje w mssql-django

Ten artykuł wymienia ograniczenia backendu mssql-django podczas korzystania z SQL Server, Azure SQL Database, Azure SQL Managed Instance oraz bazy danych SQL w Microsoft Fabric.

Ograniczenia funkcji Django

Następujące funkcje Django nie są obsługiwane lub mają ograniczone wsparcie w mssql-django backendzie:

Feature Status Details
Avg z DurationField Nieobsługiwane Agregat Avg nie działa na DurationField.
__regex oraz __iregex wyszukiwania Wymaga konfiguracji Obsługiwane po zainstalowaniu asemblera CLR na SQL Server lub Azure SQL Managed Instance. Azure SQL Database nie obsługuje asemblów CLR. Zobacz Ustaw wyszukiwania regex.
DISTINCT ON Nieobsługiwane SQL Server nie obsługuje DISTINCT ON klauzul. Użycie .values().distinct() lub podzapytania.
Subquery w ORDER BY Nieobsługiwane Uporządkowanie według wyrażeń podzapytań może nie działać.
Poziom bazy danych CASCADE Limited Niektóre SET NULL operacje mogą wymagać ręcznej migracji SET DEFAULT SQL.
DB_CASCADE, DB_SET_NULL, DB_SET_DEFAULT Nieobsługiwane Dodano odwołania na poziomie bazy danych w Django 6.1. SQL Server odrzuca wykresy kluczy obcych z wieloma kaskadowymi ścieżkami do tej samej tabeli (błąd 1785), więc nie ma natywnej ścieżki dla tej funkcji w żadnej wersji SQL Server. Użycie jednej z tych wartości podnosi system Django .fields.E324 Zamiast tego użyj standardowego poziomu on_delete Django.
BitAnd, BitOr, BitXor Nieobsługiwane Agregaty bitwise dodane w Django 6.1. SQL Server nie posiada natywnej funkcji agregacji bitowej, a backend ich nie emuluje, więc te agregaty generują NotSupportedError.
is_dst Trunc / Extract Nieobsługiwane is_dst parametr (używany do rozwiązywania niejednoznacznych czasów podczas przejść na czas letni) w Extract() i Trunc() nie jest obsługiwany. Zastosowanie AT TIME ZONE w surowym SQL do zapytań z uwzględnieniem DST.
Adnotacja zmiennoprzecinkowa Limited Agregaty zmiennoprzecinkowe Avg mogą tracić precyzję w porównaniu do PostgreSQL z powodu zachowania typu float w SQL Server. Na przykład, uśrednianie 0,1 i 0,2 może dać 0,1500000000000000000022222 zamiast dokładnie 0,15. Użycie DecimalField lub Cast(avg_expr, output_field=DecimalField()) do krytycznych obliczeń finansowych.
Anotuj/istnieje w ORDER BY Nieobsługiwane Używanie wyrażeń annotate lub exists expression w może order_by nie zadziałać.
Potęga prawej ręki i arytmetyka czasu datowego Nieobsługiwane Operacje mocy prawej strony (na przykład działa, F('value') ** 2 ale 2 ** F('value') nie działa) oraz dzielenie z nie timedelta są obsługiwane.
Strefy czasowe i timedelta Limited Strefy czasowe i timedelta nie są w pełni obsługiwane. Zobacz wsparcie stref czasowych w mssql-django.
QuerySet.iterator() bez MARS Limited Ścieżka mssql-python nie włącza Multiple Active Result Sets (MARS). Na ścieżce pyodbc MARS jest domyślnie włączony za pomocą sterownika Microsoft ODBC na Windows i MARS_Connectionextra_params jest traktowany bez uwzględnienia wielkości liter. Gdy MARS jest wyłączony, buforuje QuerySet.iterator() cały wynik w pamięci przed uzyskaniem danych. chunk_size To nie zmienia tego zachowania.
NthValue Funkcja okna Nieobsługiwane SQL Server nie obsługuje NTH_VALUE(). Użyj FIRST_VALUE, LAST_VALUE, lub podzapytania.
ignore_conflicts w bulk_create Nieobsługiwane bulk_create(objs, ignore_conflicts=True) nie jest obsługiwany. SQL Server nie ma odpowiednika dla PostgreSQL ON CONFLICT DO NOTHING.
JSONField contains lookup Nieobsługiwane Zamiast tego używaj wyszukiwań ścieżek kluczy (na przykład filter(metadata__color="blue")). Zobacz ograniczenia JSONField.
select_for_update(of=(...)) Nieobsługiwane SQL Server nie obsługuje blokowania konkretnych tabel. Backend podnosi NotSupportedError. Zobacz Zarządzanie transakcjami.

Ograniczenia migracji

Limitation Details
Alter AutoField Nie można zmienić pola na ani z AutoField (IDENTITY kolumna). Wymaga stworzenia nowej tabeli.
Przemianowanie z kluczami obcymi Zmiana nazwy kolumny z ograniczeniami klucza obcego może się nie powieść. Użyj SeparateDatabaseAndState.
AddConstraint / RemoveConstraint Konflikty Niektóre operacje ograniczeń mogą ze sobą kolidować. Aplikuj w oddzielnych migracjach.
Operacje ekstrakcji dat ExtractYear, ExtractMonth, i podobne operacje mają tzinfo ograniczone wsparcie.

Ograniczenia JSONField

  • mssql-djangoMapy JSONField do Nvarchar(max). SQL Server 2025 wprowadził natywny typ json, ale sterownik Microsoft ODBC dla SQL Server go nie udostępnia.
  • Wyszukiwanie contains nie jest obsługiwane. Zamiast tego używaj wyszukiwań ścieżek kluczy (na przykład filter(metadata__color="blue")).
  • Wartości ciągów w cudzysłowie zwracają z dodatkowymi cudzysłowami (na przykład '"value"' zamiast 'value').
  • Niektóre zagnieżdżone wyszukiwania mogą zachowywać się inaczej niż w PostgreSQL.
  • Więcej informacji można znaleźć w JSONField with SQL Server.

Ograniczenia inspectdb

  • Złożone klucze główne nie są generowane unique_together automatycznie.
  • Niektóre kolumny specyficzne dla SQL Server mogą mapować się na ogólne pola Django.
  • Przeglądaj i dostosowuj wygenerowane modele ręcznie.
  • Więcej informacji można znaleźć w artykule Reverse-engineer models with inspectdb.

Limit parametrów SQL Server

SQL Server ogranicza każde zapytanie do maksymalnie 2 100 parametrów. Ten limit dotyczy operacji Django, które generują parametryzowane zapytania z dużymi listami wartości:

Operation Jak osiąga limit
filter(field__in=large_list) Każdy element listy staje się parametrem. Backend automatycznie optymalizuje ponad 2 048 pozycji w tabeli tymczasowej.
prefetch_related() Każdy identyfikator obiektu nadrzędnego staje się parametrem w klauzuli WHERE IN powiązanego zapytania. Automatycznie zoptymalizowane, jak filter(field__in=...) przy ponad 2 048 ID.
bulk_create() Każde pole każdego obiektu staje się parametrem. Model z 10 polami i 250 obiektami generuje 2 500 parametrów.
bulk_update() Każde pole używa dwóch parametrów na każdy obiekt (jeden dla dopasowania PK, drugi dla wartości).
Q() z wieloma warunkami Każda wartość w łańcuchowych Q obiektach staje się parametrem.

Ustaw batch_size na operacjach masowych i dziel IN duże zapytania. Zobacz Performance tuning, aby znaleźć rozwiązania.

Ograniczenia operacji masowych

Ograniczenia frameworka testowego

--keepdb jest wymagany przy użyciu zarządzanego uwierzytelniania tożsamości (ActiveDirectoryMsi), ponieważ runner testu nie może tworzyć ani niszczyć baz danych tą metodą uwierzytelniania.

Więcej informacji można znaleźć w artykule Test aplikacji Django z SQL Server.

Przypisy specyficzne dla wersji

mssql-django version Notatki
2.0 Obsługuje Python 3.10 do 3.14, Django 5.2, 6.0 i 6.1, SQL Server 2017, 2019, 2022 i 2025, Azure SQL Database, Azure SQL Managed Instance oraz bazę danych SQL w Microsoft Fabric. Dodaje ścieżkę sterownika mssql-python, zachowując pyodbc jako domyślną. Więcej informacji można znaleźć w artykule Wybierz sterownik bazy danych dla mssql-django.
1.8.0 Używaj tej wersji do projektów wymagających Python 3.8, Python 3.9 lub wersji Django starszej niż 5.2.

Testowane kombinacje mssql-django 2.0 to Django 5.2 z Python 3.10 do 3.13 oraz Django 6.0 lub 6.1 z Python 3.12 do 3.14. Jeśli backend łączy się z nierozpoznaną, nowszą wersją główną SQL Server, korzysta z najnowszego zestawu możliwości, który zna, zamiast nie przechodzić weryfikacji wersji. To zachowanie nie oznacza, że nieprzetestowane funkcje są wspierane.

Przypisy specyficzne dla wersji Django

Wersja Django Notatki
5.2 CompositePrimaryKey wsparcie jest częściowe. inspectdb nadal wymaga ręcznych napraw, porównanie krotek z podzapytaniami wymaga wersji Django 5.2.4 i nowszych, a także pewnej migracji plus masowego JSONField/CASE GDY ścieżki aktualizacji nadal mają wykluczenia testowe. Więcej informacji można znaleźć w repozytorium GitHub.
6.0 Wymaga Python 3.12 i nowszych wersji. Obowiązują wszystkie ograniczenia 5.2. Backend obsługuje wszystkie zmiany API 6.0 w sposób przejrzysty.
6.1 Wymaga Python 3.12 i nowszych wersji. Obowiązują wszystkie ograniczenia 6.0. Wymaga mssql-django wersji 1.8.0 i nowszych. Nie obsługiwane są działania referencyjne na poziomie bazy danych (DB_CASCADE, DB_SET_NULL, DB_SET_DEFAULT) oraz agregaty bitowe (BitAnd, BitOr, BitXor)

Ustaw wyszukiwanie regex

Zaplecze mssql-django obsługuje Django __regex i __iregex wyszukiwania, ale wymagają one jednorazowego kroku konfiguracji. Backend dostarcza asembl CLR (regex_clr.dll), który zapewnia dbo.REGEXP_LIKE funkcję SQL Server.

Prerequisites

  • Instancja SQL Server obsługująca integrację z CLR. On-premises SQL Server i Azure SQL Managed Instance obsługują CLR. Azure SQL Database nie obsługuje asemblów CLR, więc __regex wyszukiwania nie __iregex są dostępne w Azure SQL Database.
  • Użytkownik łączący się musi mieć sysadminALTER SETTINGS uprawnienia. Polecenie zarządzania automatycznie umożliwia CLR.
  • Aplikacja mssql musi być w INSTALLED_APPS.

Zainstaluj zespół CLR

Uruchom polecenie zarządzania, przekazując nazwę swojej bazy danych:

python manage.py install_regex_clr <database>

To polecenie wykonuje następujące kroki:

  1. Włącza CLR na serwerze (sp_configure 'clr enabled', 1), jeśli nie jest już włączony.
  2. Ustawia clr strict security na 0 (wymagane dla SAFE asemblów na SQL Server 2017 i nowszych wersjach).
  3. Tworzy regex_clr asembl z zestawionego DLL.
  4. Tworzy dbo.REGEXP_LIKE funkcję skalarną.

Caution

Ustawienie clr strict security na 0 pozwala na ładowanie nieznanych zespołów CLR. Jest to wymagane, ponieważ pakiet regex_clr.dll nie jest podpisany. Omów tę zmianę ze swoim DBA przed uruchomieniem polecenia na serwerach produkcyjnych. Ustawienie dotyczy całego serwera, a nie bazy danych.

Użyj wyszukiwań regex

Po zainstalowaniu asemblera, użyj __regex i __iregex w zestawach zapytań:

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

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

Backend tłumaczy te wyszukiwania na dbo.REGEXP_LIKE(column, pattern, case_flag) = 1.

Ważna

dbo.REGEXP_LIKE ignoruje dosłowne odstępy w wzorze. Wzór taki jak pasuje ^Widget \d+$ tak, jakby był , ^Widget\d+$więc nie zwraca żadnych wierszy względem wartości Widget 42. Zapisz przestrzenie jako \s lub jako klasę znaków, taką jak [ ]. Nic się nie podnosi, więc pusty wynik wygląda jak problem z danymi.

Uwaga / Notatka

Musisz wykonać install_regex_clr polecenie raz na każdą bazę danych. Jeśli baza danych zostanie usunięta i odtworzona (na przykład podczas testów), uruchom polecenie ponownie.