Korlátok és nem támogatott funkciók az mssql-django

Ez a cikk felsorolja a mssql-django backend korlátait, amikor SQL Server, Azure SQL Database, Azure SQL Managed Instance és SQL database a Microsoft Fabric-ben használatban van.

Django funkciókorlátai

Az alábbi Django funkciók nem támogatottak vagy korlátozott a mssql-django háttérrendszerrel:

Feature Status Részletek
Avg és DurationField Nem támogatott Az aggregált Avg nem működik .DurationField
__regex és __iregex keresések Telepítést igényel Támogatott, miután telepítette a CLR assembly SQL Server-re vagy Azure SQL Managed Instance-ra. Azure SQL Database nem támogatja CLR assemblies-t. Lásd: Regex lekérdezések beállítása.
DISTINCT ON Nem támogatott Az SQL Server nem támogatja DISTINCT ON a záradékokat. Használj .values().distinct() vagy kiváltott lekérdezéseket.
Subquery a(z) ORDER BY rendszerben Nem támogatott Az allekérdezések szerinti sorrendezés nem feltétlenül működik.
Adatbázis-szintű CASCADE Limited Néhány SET NULL művelet SET DEFAULT manuális migrációt igényelhet SQL-t.
is_dst a következőben: Trunc/Extract Nem támogatott is_dst a paraméter (amelyet a nyári időszámítások kétértelmű időpontok megoldására használnak) be, Extract() és Trunc() nem támogatott. Használat AT TIME ZONE nyers SQL-ben DST-érzékeny lekérdezésekhez.
Lebegőpontos megjegyzés Limited A lebegőpontos Avg aggregátumok a PostgreSQL-hez képest a SQL Server lebegő típusú viselkedése miatt elveszíthetik pontosságukat. Például, ha 0,1 és 0,2 átlaggal adunk 0,1500000000000000000000022 értéket pontosan 0,15 helyett. Felhasználás DecimalField vagy Cast(avg_expr, output_field=DecimalField()) kritikus pénzügyi számítások esetén.
Megjegyzések/léteznek ORDER BY Nem támogatott Az annotáció vagy létező kifejezések használata order_by nem feltétlenül működik.
Jobbkezes hatvány és dátumidő számozás Nem támogatott A jobbkezes erőműveletek (például működik F('value') ** 2 , de 2 ** F('value') kudarcot vall) és a osztás nem timedelta támogatott.
Időzónák és idődelták Limited Az időzónák és idődelták nem teljesen támogatottak. Lásd az Időzóna támogatást az mssql-django-ban.
NthValue Ablakfüggvény Nem támogatott Az SQL Server nem támogatja NTH_VALUE(). Használj FIRST_VALUE, LAST_VALUE, vagy egy allekérdezést.
ignore_conflicts a(z) bulk_create rendszerben Nem támogatott bulk_create(objs, ignore_conflicts=True) nem támogatott. Az SQL Server-nek nincs megfelelője a PostgreSQL-évé ON CONFLICT DO NOTHING.
JSONField contains keresés Nem támogatott Használj helyette kulcs-út lekérdezéseket (például filter(metadata__color="blue")). Lásd a JSONField korlátozásait.
select_for_update(of=(...)) Nem támogatott Az SQL Server nem támogatja bizonyos táblák zárolását. A háttér emeli NotSupportedErrora . Lásd: Tranzakciókezelés.

A migrálásra vonatkozó korlátozások

Limitation Részletek
Alter AutoField Nem lehet egy mezőt (oszlopba) vagy AutoFieldIDENTITY -re váltani. Ehhez új táblázat kell létrehozni.
Átnevezés idegen billentyűkkel Egy olyan oszlop átnevezése, amelynek van külföldi kulcskorlátai, meghibásodott. Használja a SeparateDatabaseAndState.
AddConstraint / RemoveConstraint Konfliktusok Bizonyos korlátozási műveletek ütközhetnek. Jelentkezz külön migrációkban.
Dátumkivonat műveletek ExtractYear, ExtractMonth, és hasonló műveletek korlátozott tzinfo támogatással rendelkeznek.

JSONField korlátozások

  • mssql-django Térképek JSONFieldnvarchar(max) irányába. Az SQL Server 2025 bevezetett egy natív json típust, de a Microsoft ODBC Driver for SQL Server nem mutatja be.
  • A contains keresés nem támogatott. Használj helyette kulcs-út lekérdezéseket (például filter(metadata__color="blue")).
  • A idézetelt stringértékek extra idézőjelekkel térnek vissza (például '"value"' helyette 'value').
  • Néhány beépített lekérdezés másképp viselkedhet, mint a PostgreSQL-en.
  • További információért lásd: JSONField with SQL Server.

InspectDB korlátozások

  • Az összetett elsődleges kulcsok nem automatikusan generálódnak unique_together .
  • Néhány SQL Server-specifikus oszloptípus általános Django mezőkhöz egyezhet meg.
  • Nézd át és igazítsd kézzel a generált modelleket.
  • További információért lásd: Reverse-engineer models with inspectdb.

SQL Server paraméterkorlát

Az SQL Server minden lekérdezést legfeljebb 2 100 paraméterre korlátoz. Ez a korlát a Django műveletekre vonatkozik, amelyek paraméterezett lekérdezéseket generálnak nagy értékű listákkal:

Operation Hogyan éri el a határt
filter(field__in=large_list) Minden lista elem egy paraméterré válik. A háttérrendszer automatikusan optimalizálja több mint 2 048 tételt egy ideiglenes táblába.
prefetch_related() Minden szülői objektumazonosító egy paraméter lesz a kapcsolódó lekérdezés WHERE IN záradékában. Automatikus optimalizálás, például filter(field__in=...) ha több mint 2 048 azonosító van.
bulk_create() Minden objektum minden mezője paraméterré válik. Egy modell, amelynek 10 mezője és 250 objektuma van, 2 500 paramétert generál.
bulk_update() Minden mező két paramétert használ objektumonként (egyet a PK egyezésre, egyet az értékre).
Q() sok feltétellel Minden érték láncolt Q objektumokban egy paraméterré válik.

Kezdj batch_size el tömeges műveleteket végezni, és nagy IN mennyiségű lekérdezést végezzek. A megoldásokért lásd Teljesítmény hangolást .

Tömeges műveletek korlátozásai

Tesztkeret korlátai

--keepdb szükséges menedzselt azonosítás esetén (ActiveDirectoryMsi), mert a tesztfuttató nem tud adatbázisokat létrehozni vagy megsemmisíteni ezzel a hitelesítési módszerrel.

További információért lásd: Test Django apps with SQL Server.

Verzióspecifikus jegyzetek

MSSQL-django verzió Jegyzetek
1.7.4 Fixáltam IndexError azokat a GROUP BY lekérdezéseket, amelyek keverik a menekült %% literálisokat valódi paramokkal. Javítva NotImplementedError a IntegerChoices paramokra a nyers GROUP BY lekérdezésekben.
1.7.3 Javítva FA001 más Authentication= módokra is, mint ActiveDirectoryMsi. Fixálva KeyErrorDatabaseWrapper alosztályozott (regresszió az 1.7.1-ből).
1.7.2 Fix időzóna kezelés a datetimeoffset esetén és Now() .USE_TZ=True Javítottam .explain() a kompatibilitást a Django 4.0 és újabb verziókhoz.
1.7.1 SQL adatbázis a Fabric-ben (EngineEdition 12) javítás. Csökkenő indexjavítás AlterField .
1.7 Az ODBC Driver 18 az alapértelmezett. Django 6.0, Python 3.14, SQL Server 2025 támogatás hozzáadva.
1.6 Django 5.1 és 5.2 támogatás. Fejlesztett JSON funkció.
1.5 Hibajavítások AutoFieldhez, paraméterformázáshoz és sémalekérdezésekhez.
1.4 Django 5.0 támogatás. db_comment támogat.
1.3 Django 4.2 támogatás.
1.2 Django 4.1 támogatás. Időzóna támogatás. return_rows_bulk_insert opció. SQL Server 2022 támogatás.
1.1 Django 3.2 és 4.0 támogatás.

Django verzió-specifikus jegyzetek

Django verzió Jegyzetek
5.1 inspectdb Képes megvizsgálni összetett elsődleges kulcsú táblákat, de nem generál teljes modelldefiníciókat számukra.
5.2 CompositePrimaryKey A támogatás részleges. inspectdb továbbra is kézi javításokat igényel, a tuple-összehasonlításhoz az allekérdezésekkel Django 5.2.4 és újabb verziók szükségesek, valamint némi migráció plusz JSONField tömeg/CASE WHEN frissítési útvonalakon még vannak tesztkizárások. További információért lásd a GitHub repozióriumot.
6.0 Ehhez Python 3.12 és újabb verziók szükségesek. Minden 5.2-es korlátozás érvényes. A backend átláthatóan kezeli az összes 6.0-s API változást.

Regex lekérdezések beállítása

A mssql-django backend támogatja a __regex Django-kat és __iregex a lekérdezéseket, de ehhez egyszeri beállítási lépés szükséges. A háttérrendszer egy CLR assembly (regex_clr.dll) rendszert biztosít, amely funkciót dbo.REGEXP_LIKE biztosít az SQL Server-nek.

Prerequisites

  • Egy SQL Server példány, amely támogatja a CLR integrációt. On-premises SQL Server és Azure SQL Managed Instance support CLR. Az Azure SQL Database nem támogatja a CLR összeállításokat, így __regex és __iregex lekérdezések nem elérhetők az Azure SQL Database-ben.
  • A csatlakozó felhasználónak engedélyt sysadmin kell szereznie vagy ALTER SETTINGS engedélyt kell szereznie. A menedzsment parancs automatikusan engedélyezi a CLR-t.
  • Az mssql alkalmazásnak meg kell lennie INSTALLED_APPS.

Telepítsd a CLR összeállítást

Futtasd be a menedzsment parancsot, és add át az adatbázis nevét:

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

Ez a parancs a következő lépéseket végzi:

  1. Engedélyezi a CLR-t a szerveren (sp_configure 'clr enabled', 1), ha még nincs engedélyezve.
  2. Beállítás clr strict security be 0 (szükséges az SAFE SQL Server 2017+ összeállításaihoz).
  3. Létrehozza a regex_clr assembly összeállítást a csomagolt DLL-ből.
  4. Létrehozza a dbo.REGEXP_LIKE skaláris funkciót.

Caution

Beállítás clr strict security0 lehetővé teszi az aláíratlan CLR összeállítások betöltését. Ez azért szükséges, mert a csomag regex_clr.dll nincs aláírva. Beszéld meg ezt a változást a DBA-ddal, mielőtt a parancsot a gyártó szervereken futtatnád. Ez a beállítás szerverre vonatkozik, nem adatbázisonként.

Használj regex lekérdezéseket

A assembly telepítése után használd __regex és __iregex a querysetekben:

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

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

A háttérrendszer ezeket a lekérdezéseket úgy fordítja le.dbo.REGEXP_LIKE(column, pattern, case_flag) = 1

Note

A parancsot egyszer kell futtatnod install_regex_clr adatbázisonként. Ha az adatbázist eltávolítják és újraalkotják (például tesztelés közben), futtasd újra a parancsot.