Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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-djangoMapyJSONFieldna Nvarchar(max). SQL Server 2025 zavedl nativní typ json, ale Microsoft ODBC Driver pro SQL Server jej nezpřístupňuje. - Vyhledávání
containsnení podporováno. Použijte místo toho vyhledávání podle klíčové cesty (napříkladfilter(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í
-
bulk_createsreturn_rows_bulk_insert=Falsenevrací doklady. Vyžaduje to u stolů s triggery. Viz Hromadné operace s mssql-django.
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__iregexa vyhledávací soubory nejsou dostupné v Azure SQL Database. - Připojující uživatel musí mít
sysadminALTER SETTINGSoprávnění. Příkaz pro správu automaticky aktivuje CLR. - Aplikace
mssqlmusí být vINSTALLED_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:
- Zapne CLR na serveru (
sp_configure 'clr enabled', 1), pokud už není povolený. - Nastaví
clr strict securityse na0(vyžaduje se proSAFEassemblery na SQL Server 2017+). - Vytvoří sestavení
regex_clrz balíčku DLL. - Vytváří
dbo.REGEXP_LIKEskalá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.