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.
\, \, \ Nem támogatott Adatbázis-szintű referenciális műveletek hozzáadva a Django 6.1-ben. Az SQL Server elutasítja azokat a külföldi kulcsgrafikonokat, amelyek több kaszkád úttal ugyanahhoz a táblához vezetnek (hiba 1785), így nincs natív útvonal ehhez a funkcióhoz egyetlen SQL Server verzióban sem. Ezeknek az értékeknek az egyike esetén a Django rendszer ellenőrzése fields.E324jelent. Használd inkább a szokásos Django-szintet on_delete .
\, \, \ Nem támogatott Bitenkénti összesítések hozzáadva Django 6.1-ben. Az SQL Server-nek nincs natív bitenkénti aggregációs funkciója, és a háttérrendszer sem emulálja őket, így ezek az aggregátumok .NotSupportedError
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.
QuerySet.iterator() MARS nélkül Limited Az mssql-python út nem engedélyezi a Több Aktív Eredményhalmazt (MARS). A pyodbc útvonalon a MARS alapértelmezetten engedélyezett egy Microsoft ODBC illevízzel Windows-on, és MARS_Connectionextra_params a kis- és nagybetűvel érzéketlenül tiszteljük. Amikor a MARS ki van kapcsolva, az QuerySet.iterator() egész eredményt pufferelte a memóriában, mielőtt átengedne. chunk_size Ez nem változtat ezen a viselkedésen.
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
2.0 Támogatja a Python 3.10-től 3.14-ig, Django 5.2-n, 6.0-nak és 6.1-et, SQL Server 2017-nek, 2019-nek, 2022-nek és 2025-ösnek, Azure SQL Database-nak, Azure SQL Managed Instance-nak és SQL adatbázis-adatbázis-rendszert a Microsoft Fabric-ben. Hozzáadja az mssql-python driver útvonalat, miközben a pyodbc alapértelmezett marad. További információért lásd: Select the database driver for mssql-django számára.
1.8.0 Használd ezt a verziót olyan projektekhez, amelyekhez Python 3.8, Python 3.9 vagy 5.2 előtti Django verzió szükséges.

A tesztelt mssql-django 2.0 kombinációk a Django 5.2 a Python 3.10-től 3.13-ig, valamint a Django 6.0 vagy 6.1 a Python 3.12-től 3.14-ig. Ha a backend csatlakozik egy ismeretlen, újabb, SQL Server fő verzióhoz, akkor a legfrissebb képességkészletet használja, amit ismert, ahelyett, hogy meghibásolná a verzióellenőrzést. Ez a viselkedés nem nyilvánítja a tesztelt funkciókat támogatottnak.

Django verzió-specifikus jegyzetek

Django verzió Jegyzetek
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.
6.1 Ehhez Python 3.12 és újabb verziók szükségesek. Minden 6.0-s korlátozás érvényes. Ehhez 1.8.0 és újabb verziók szükségesek mssql-django . Az adatbázis-szintű referenciális műveletek (DB_CASCADE, DB_SET_NULL, DB_SET_DEFAULT) és a bitenkénti aggregátumok (BitAnd, BitOr, BitXor) nem támogatottak.

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 <database>

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 (0szükséges az SAFE SQL Server 2017 és későbbi verziók összeszereléseihez).
  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\s\d+$")

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

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

Important

dbo.REGEXP_LIKE figyelmen kívül hagyja a mintában lévő szó szerinti fehér teret. Egy mintázat, ^Widget \d+$ például egyezik azzal, mintha , így ^Widget\d+$nem ad vissza sorokat az érték Widget 42ellen . Írj tereket karakterosztályként \s vagy karakterosztályként, például [ ]. Semmi sem emelkedik, így az üres eredmény adatproblémaként néz ki.

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.