Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Dieser Artikel listet die Einschränkungen des Backends auf, wenn es mssql-django mit SQL Server, Azure SQL-Datenbank, Azure SQL Managed Instance und SQL Database in Microsoft Fabric verwendet wird.
Django-Funktionseinschränkungen
Die folgenden Django-Funktionen werden nicht unterstützt oder haben nur begrenzte Unterstützung im mssql-django Backend:
| Merkmal | Status | Details |
|---|---|---|
Avg mit DurationField |
Nicht unterstützt | Aggregate Avg funktionieren nicht auf DurationField. |
__regex und __iregex Lookups |
Einrichtung erforderlich | Unterstützt nach Installation der CLR-Assembler auf SQL Server oder Azure SQL Managed Instance. Azure SQL-Datenbank unterstützt keine CLR-Assemblies. Siehe Regex-Lookups einrichten. |
DISTINCT ON |
Nicht unterstützt | SQL Server unterstützt DISTINCT ON keine Klauseln. Verwenden .values().distinct() oder Unteranfragen. |
Subquery in ORDER BY |
Nicht unterstützt | Die Reihenfolge nach Unterfrageausdrücken funktioniert möglicherweise nicht. |
Datenbankebene CASCADE |
Eingeschränkt | Einige SET NULL Operationen SET DEFAULT können manuelle Migration von SQL erfordern. |
is_dst in Trunc/Extract |
Nicht unterstützt |
is_dst Parameter (zur Auflösung von mehrdeutigen Zeiten während Sommerzeitübergängen) in Extract() und Trunc() wird nicht unterstützt. Nutze AT TIME ZONE in Raw SQL für DST-bewusste Abfragen. |
| Gleitkomma-Annotation | Eingeschränkt | Gleitkommaaggregate Avg können im Vergleich zu PostgreSQL an Präzision verlieren, da SQL Server das Float-Verhalten hat. Zum Beispiel könnte ein Durchschnitt von 0,1 und 0,2 0,15000000000000000222 statt genau 0,15 ergeben.
DecimalField Verwendung oder Cast(avg_expr, output_field=DecimalField()) für kritische finanzielle Berechnungen. |
Annotieren/existiert in ORDER BY |
Nicht unterstützt | Die Verwendung von Annotationen oder existierenden Ausdrücken in order_by könnte nicht funktionieren. |
| Rechte Hand Potenz- und Datums-Arithmetik | Nicht unterstützt | Rechtshändige Energieoperationen (zum Beispiel F('value') ** 2 funktionieren, aber 2 ** F('value') scheitern) und Division mit timedelta werden nicht unterstützt. |
| Zeitzonen und Zeitdeltas | Eingeschränkt | Zeitzonen und Zeitverschiebungen werden nicht vollständig unterstützt. Siehe Zeitzonenunterstützung in mssql-django. |
NthValue Fensterfunktion |
Nicht unterstützt | SQL Server unterstützt NTH_VALUE()das nicht. Verwenden Sie FIRST_VALUE, LAST_VALUE, oder eine Subquery. |
ignore_conflicts in bulk_create |
Nicht unterstützt |
bulk_create(objs, ignore_conflicts=True) wird nicht unterstützt. SQL Server hat kein Äquivalent zu PostgreSQL.ON CONFLICT DO NOTHING |
JSONField-Suche contains |
Nicht unterstützt | Verwenden Sie stattdessen Key-Path-Lookups (zum Beispiel filter(metadata__color="blue")). Siehe JSONField-Einschränkungen. |
select_for_update(of=(...)) |
Nicht unterstützt | SQL Server unterstützt das Sperren bestimmter Tabellen nicht. Das Backend erhöht NotSupportedError. Siehe Transaktionsmanagement. |
Einschränkungen bei der Migration
| Einschränkung | Details |
|---|---|
Alter AutoField |
Ein Feld kann nicht zu oder von AutoField (IDENTITY Spalte) geändert werden. Erfordert das Erstellen einer neuen Tabelle. |
| Umbenennung mit Fremdschlüsseln | Das Umbenennen einer Spalte mit Fremdschlüssel-Constraints kann scheitern. Verwenden Sie SeparateDatabaseAndState. |
AddConstraint
/
RemoveConstraint Konflikte |
Manche Einschränkungsoperationen können im Widerspruch stehen. Bewerben Sie sich in separaten Migrationen. |
| Operationen zur Datierungsextraktion |
ExtractYear, ExtractMonth, und ähnliche Operationen haben nur begrenzte tzinfo Unterstützung. |
JSONField-Einschränkungen
-
mssql-djangoMapsJSONFieldzu nvarchar(max). SQL Server 2025 führte einen nativen JSON-Typ ein, aber der Microsoft ODBC-Treiber für SQL Server stellt ihn nicht offen. - Die Suche
containswird nicht unterstützt. Verwenden Sie stattdessen Key-Path-Lookups (zum Beispielfilter(metadata__color="blue")). - Angeführte String-Werte werden mit zusätzlichen Anführungszeichen zurückgegeben (zum Beispiel
'"value"'statt'value'). - Einige verschachtelte Nachschlagefunktionen könnten sich anders verhalten als bei PostgreSQL.
- Weitere Informationen finden Sie unter JSONField mit SQL Server.
InspektionDB-Einschränkungen
- Zusammengesetzte Primärschlüssel werden nicht automatisch generiert
unique_together. - Einige SQL Server-spezifische Spaltentypen könnten auf generische Django-Felder abgebildet werden.
- Überprüfen und passen Sie generierte Modelle manuell an.
- Weitere Informationen finden Sie unter Reverse-engineer models with inspectdb.
SQL Server-Parameterlimit
SQL Server begrenzt jede Abfrage auf maximal 2.100 Parameter. Diese Grenze betrifft Django-Operationen, die parametrisierte Abfragen mit großen Wertlisten generieren:
| Vorgang | Wie es an die Grenze stößt |
|---|---|
filter(field__in=large_list) |
Jedes Listenelement wird zu einem Parameter. Das Backend optimiert automatisch über 2.048 Elemente in eine temporäre Tabelle. |
prefetch_related() |
Jede Elternobjekt-ID wird zu einem Parameter in der WHERE IN Klausel der zugehörigen Abfrage. Auto-optimiert, wie filter(field__in=...) bei über 2.048 IDs. |
bulk_create() |
Jedes Feld jedes Objekts wird zu einem Parameter. Ein Modell mit 10 Feldern und 250 Objekten erzeugt 2.500 Parameter. |
bulk_update() |
Jedes Feld verwendet pro Objekt zwei Parameter (einen für das PK-Match, einen für den Wert). |
Q() mit vielen Bedingungen |
Jeder Wert in ketteten Q Objekten wird zu einem Parameter. |
Setzen Sie batch_size auf Massenoperationen und Chunk-Large-Abfragen IN . Siehe Performance Tuning für Lösungen.
Einschränkungen der Massenbetriebe
-
bulk_createmitreturn_rows_bulk_insert=Falsegibt keine Ausweise zurück. Erforderlich für Tabellen mit Auslösern. Siehe Bulk-Operationen mit mssql-django.
Einschränkungen des Testframeworks
--keepdb ist bei der Verwendung der Managed Identity Authentication (ActiveDirectoryMsi) erforderlich, weil der Testrunner Datenbanken mit dieser Authentifizierungsmethode nicht erstellen oder vernichten kann.
Weitere Informationen finden Sie unter Django Apps mit SQL Server testen.
Versionsspezifische Anmerkungen
| mssql-django version | Hinweise |
|---|---|
| 1.7.3 | Behoben FA001 für Authentication= andere Modi als ActiveDirectoryMsi. Fixiert KeyError auf Subclassed DatabaseWrapper (Regression von 1.7.1). |
| 1.7.2 | Fixe Zeitzonenbehandlung für Datetimeoffset und Now() mit USE_TZ=True. Kompatibilität für Django 4.0 und später behoben .explain() . |
| 1.7.1 | SQL-Datenbank in Fabric (EngineEdition 12) Korrektur. Korrektur absteigender Index AlterField . |
| 1.7 | ODBC Driver 18 ist der Standard. Django 6.0, Python 3.14, SQL Server 2025 Unterstützung hinzugefügt. |
| 1.6 | Unterstützung für Django 5.1 und 5.2. Erweiterte JSON-Funktionalität. |
| 1.5 | Fehlerbehebungen für AutoField, Parameterformatierung und Schema-Abfragen. |
| 1.4 | Django 5.0 Unterstützung. Unterstützung db_comment |
| 1.3 | Django 4.2 Unterstützung. |
| 1.2 | Django 4.1 Unterstützung. Zeitzonenunterstützung.
return_rows_bulk_insert Option. Unterstützung für SQL Server 2022. |
| 1.1 | Unterstützung für Django 3.2 und 4.0. |
Versionsspezifische Anmerkungen zu Django
| Django-Version | Hinweise |
|---|---|
| 5,1 |
inspectdb Man kann Tabellen mit zusammengesetzten Primärschlüsseln inspizieren, aber es generiert keine vollständigen Modelldefinitionen dafür. |
| 5,2 |
CompositePrimaryKey Die Unterstützung ist teilweise.
inspectdb erfordert weiterhin manuelle Korrekturen, Tuple-Vergleiche mit Subqueries erfordern Django 5.2.4 und neuere Versionen sowie etwas Migration plus JSONField bulk/CASE WHEN Aktualisierungspfade noch Testausschlüsse haben. Weitere Informationen finden Sie im GitHub-Repository. |
| 6.0 | Benötigt Python 3.12 und neuere Versionen. Alle 5.2-Einschränkungen gelten. Das Backend behandelt alle Änderungen der 6.0-API transparent. |
Regex-Lookups einrichten
Das mssql-django Backend unterstützt Djangos __regex und __iregex Lookups, aber sie erfordern einen einmaligen Einrichtungsschritt. Das Backend liefert eine CLR-Assembler (regex_clr.dll), die eine dbo.REGEXP_LIKE Funktion für SQL Server bereitstellt.
Voraussetzungen
- Eine SQL Server-Instanz, die CLR-Integration unterstützt. On-premises SQL Server und Azure SQL Managed Instance unterstützen CLR.
Azure SQL-Datenbank unterstützt keine CLR-Assemblies, daher
__regex__iregexsind Nachschlagefunktionen in Azure SQL-Datenbank nicht verfügbar. - Der verbindende Nutzer muss eine Erlaubnis
ALTER SETTINGShabensysadmin. Der Management-Befehl aktiviert CLR automatisch. - Die
mssqlApp muss inINSTALLED_APPS.
Installation der CLR-Baugruppe
Führe den Management-Befehl aus und übergebe deinen Datenbanknamen:
python manage.py install_regex_clr <your-database-name>
Dieser Befehl führt folgende Schritte aus:
- Aktiviert CLR auf dem Server (
sp_configure 'clr enabled', 1), falls nicht bereits aktiviert. - Setzt
clr strict securityauf0(erforderlich fürSAFEAssemblies auf SQL Server 2017+). - Erstellt die
regex_clrAssembly aus der gebündelten DLL. - Erzeugt die
dbo.REGEXP_LIKEskalare Funktion.
Vorsicht
Setzt clr strict security auf 0 erlaubt das Laden von nicht signierten CLR-Assemblies. Das ist erforderlich, weil das Bundled regex_clr.dll nicht signiert ist. Bespreche diese Änderung mit deinem DBA, bevor du den Befehl auf Produktionsservern ausführst. Die Einstellung gilt serverweit, nicht pro Datenbank.
Verwende Regex-Lookups
Nach der Installation der Assembly verwenden __regex Sie und __iregex in Abfragesätzen:
# Case-sensitive regex
products = Product.objects.filter(name__regex=r"^Widget \d+$")
# Case-insensitive regex
products = Product.objects.filter(name__iregex=r"^widget \d+$")
Das Backend übersetzt diese Lookups in dbo.REGEXP_LIKE(column, pattern, case_flag) = 1.
Note
Du musst den install_regex_clr Befehl einmal pro Datenbank ausführen. Wenn die Datenbank entfernt und neu erstellt wird (zum Beispiel während des Tests), führe den Befehl erneut aus.