Omezení a nepodporované funkce v mssql-django

Tento článek uvádí omezení backendu mssql-django při použití se SQL Server, Azure SQL Database, Azure SQL Managed Instance a SQL databází ve Microsoft Fabric.

Omezení funkcí Django

Následující funkce Django nejsou podporovány nebo mají omezenou podporu na backendu mssql-django :

Vlastnost Stav Podrobnosti
Avg s DurationField Nepodporováno Agregát Avg na DurationField.
__regex a __iregex vyhledávání Vyžaduje nastavení. Podpora po instalaci CLR assembleru na SQL Server nebo Azure SQL Managed Instance. Azure SQL Database nepodporuje CLR assemblies. Viz Nastavit regex vyhledání.
DISTINCT ON Nepodporováno SQL Server nepodporuje DISTINCT ON klauzule. Použití .values().distinct() nebo poddotazy.
Subquery v ORDER BY Nepodporováno Seřazení podle výrazů poddotazů nemusí fungovat.
Databázová úroveň CASCADE Limited Některé SET NULL operace mohou SET DEFAULT vyžadovat manuální migraci SQL.
is_dst In Trunc/Extract Nepodporováno is_dst parametr (používaný k vyřešení nejasných časů během přechodů letního času) v Extract() a Trunc() není podporován. Použití AT TIME ZONE v surovém SQL pro dotazy s vědomím DST.
Anotace s plovoucí desetinnou čárkou Limited Agregáty s plovoucí desetinnou čárkou Avg mohou ztrácet přesnost ve srovnání s PostgreSQL kvůli chování typu plovoucího typu SQL Server. Například průměrování 0,1 a 0,2 může dát 0,150000000000000002222 místo přesně 0,15. Použití DecimalField nebo Cast(avg_expr, output_field=DecimalField()) pro kritické finanční výpočty.
Anotovat/existuje v ORDER BY Nepodporováno Použití výrazů annotate nebo exists v nemusí order_by fungovat.
Pravá mocnina a časová aritmetika Nepodporováno Operace s pravou mocností (například funguje, F('value') ** 2 ale 2 ** F('value') selže) a dělení s nejsou timedelta podporovány.
Časová pásma a časové delty Limited Časová pásma a časové delty nejsou plně podporovány. Viz Time zone support in mssql-django.
NthValue Funkce okna Nepodporováno SQL Server nepodporuje NTH_VALUE(). Použijte FIRST_VALUE, LAST_VALUE, nebo poddotaz.
ignore_conflicts v bulk_create Nepodporováno bulk_create(objs, ignore_conflicts=True) není podporováno. SQL Server nemá ekvivalent PostgreSQL .ON CONFLICT DO NOTHING
JSONField contains lookup Nepodporováno Použijte místo toho vyhledávání podle klíčové cesty (například filter(metadata__color="blue")). Viz omezení JSONField.
select_for_update(of=(...)) Nepodporováno SQL Server nepodporuje zamykání konkrétních tabulek. Backend zvyšuje NotSupportedError. Viz správa transakcí.

Omezení migrace

Omezení Podrobnosti
Alter AutoField Nelze změnit pole na ani z AutoField (IDENTITY sloupec). Vyžaduje vytvoření nové tabulky.
Přejmenování cizími klíči Přejmenování sloupce, který má omezení cizího klíče, může selhat. Použijte SeparateDatabaseAndState.
AddConstraint / RemoveConstraint Konflikty Některé operace s omezeními mohou být v konfliktu. Přihlaste se v samostatných migracích.
Operace s extraktem dat ExtractYear, ExtractMonth, a podobné operace mají omezenou tzinfo podporu.

JSONField omezení

  • mssql-djangoMapy JSONField na Nvarchar(max). SQL Server 2025 zavedl nativní typ json, ale Microsoft ODBC Driver pro SQL Server jej nezpřístupňuje.
  • Vyhledávání contains není podporováno. Použijte místo toho vyhledávání podle klíčové cesty (například filter(metadata__color="blue")).
  • Citované hodnoty řetězců se vracejí s dalšími uvozovkami (například '"value"' místo ).'value'
  • Některá vnořená vyhledávání se mohou chovat jinak než v PostgreSQL.
  • Pro více informací viz JSONField with SQL Server.

Omezení inspectdb

  • Kompozitní primární klíče se negenerují automaticky unique_together .
  • Některé typy sloupců specifické pro SQL Server mohou být mapovány na obecná pole Django.
  • Ručně kontrolujte a upravujte generované modely.
  • Pro více informací viz Reverzní inženýrství modelů s inspectdb.

Limit parametrů SQL Server

SQL Server omezuje každý dotaz na maximálně 2 100 parametrů. Tento limit ovlivňuje operace Django, které generují parametrizované dotazy s velkými seznamy hodnot:

Operation Jak dosahuje limitu
filter(field__in=large_list) Každý bod seznamu se stává parametrem. Backend automaticky optimalizuje přes 2 048 položek do dočasné tabulky.
prefetch_related() Každé ID rodičovského objektu se stává parametrem v příslušné klauzuli WHERE IN dotazu. Automaticky optimalizované, například filter(field__in=...) když je přes 2 048 ID.
bulk_create() Každé pole každého objektu se stává parametrem. Model s 10 poli a 250 objekty generuje 2 500 parametrů.
bulk_update() Každé pole používá dva parametry na objekt (jeden pro PK shodu, druhý pro hodnotu).
Q() s mnoha podmínkami Každá hodnota v řetězených Q objektech se stává parametrem.

Nastavte si batch_size hromadné operace a velké dotazy rozdělte IN na části. Viz Performance tuning pro řešení.

Omezení hromadných operací

Omezení testovacího rámce

--keepdb je vyžadováno při použití spravované identity autentizace (ActiveDirectoryMsi), protože testovací runner nemůže touto metodou autentizace vytvářet ani ničit databáze.

Pro více informací viz Test Django apps with SQL Server.

Poznámky specifické pro verzi

mssql-django version Poznámky
1.7.3 Fixováno FA001 pro Authentication= jiné módy než ActiveDirectoryMsi. Opraveno KeyError na podtřídě DatabaseWrapper (regrese z 1.7.1).
1.7.2 Pevné zpracování časových pásem pro datetimeoffset a Now() s .USE_TZ=True Opravená .explain() kompatibilita pro Django 4.0 a novější.
1.7.1 SQL databáze ve Fabric (EngineEdition 12) oprava. Oprava klesajícího indexu AlterField .
1.7 ODBC ovladač 18 je výchozí. Podpora Django 6.0, Python 3.14, SQL Server 2025 přidána.
1.6 Podpora Django 5.1 a 5.2. Vylepšená funkcionalita JSON.
1.5 Opravy chyb pro AutoField, formátování parametrů a dotazy na schémata.
1.4 Podpora Django 5.0. db_comment podpora.
1.3 Podpora Django 4.2.
1,2 Podpora Django 4.1. Podpora časových pásem. return_rows_bulk_insert možnost. Podpora SQL Server 2022.
1.1 Podpora Django 3.2 a 4.0.

Poznámky specifické pro verzi Django

Django verze Poznámky
5,1 inspectdb může kontrolovat tabulky s kompozitními primárními klíči, ale negeneruje pro ně úplné definice modelů.
5.2 CompositePrimaryKey Podpora je částečná. inspectdb stále vyžaduje ruční opravy, porovnání n-tic s poddotazy vyžaduje Django 5.2.4 a novější verze, a nějakou migraci plus JSONField bulk/CASE WHEN aktualizační cesty stále obsahují testovací výluky. Pro více informací navštivte repozitář GitHub.
6.0 Vyžaduje Python 3.12 a pozdější verze. Platí všechna omezení 5.2. Backend transparentně zpracovává všechny změny API 6.0.

Nastavte regex vyhledávání

Backend mssql-django podporuje Django __regex a __iregex vyhledávání, ale vyžadují jednorázový krok nastavení. Backend obsahuje CLR assembler (regex_clr.dll), který poskytuje dbo.REGEXP_LIKE funkci pro SQL Server.

Prerequisites

  • Instance SQL Server, která podporuje integraci CLR. On-premises SQL Server a Azure SQL Managed Instance podporují CLR. Azure SQL Database nepodporuje CLR assemblie, takže __regex__iregex a vyhledávací soubory nejsou dostupné v Azure SQL Database.
  • Připojující uživatel musí mít sysadminALTER SETTINGS oprávnění. Příkaz pro správu automaticky aktivuje CLR.
  • Aplikace mssql musí být v INSTALLED_APPS.

Nainstalujte CLR sestavu

Spusť příkaz správy a předej název databáze:

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

Tento příkaz provádí následující kroky:

  1. Zapne CLR na serveru (sp_configure 'clr enabled', 1), pokud už není povolený.
  2. Nastaví clr strict security se na 0 (vyžaduje se pro SAFE assemblery na SQL Server 2017+).
  3. Vytvoří sestavení regex_clr z balíčku DLL.
  4. Vytváří dbo.REGEXP_LIKE skalární funkci.

Caution

Nastavení clr strict security na 0 umožňuje načtení nepodepsaných CLR assemblerů. To je nutné, protože balíček regex_clr.dll není podepsán. Tuto změnu proberte se svým DBA před spuštěním příkazu na produkčních serverech. Nastavení platí pro celý server, ne pro každou databázi.

Použijte regex vyhledávání

Po instalaci assembleru použijte __regex a __iregex v querysetech:

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

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

Backend převádí tyto vyhledávání na dbo.REGEXP_LIKE(column, pattern, case_flag) = 1.

Note

Příkaz musíte spustit install_regex_clr jednou v každé databázi. Pokud je databáze zapuštěna a znovu vytvořena (například během testování), spusťte příkaz znovu.