Einschränkungen und nicht unterstützte Funktionen in mssql-django

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-djangoMaps JSONField zu 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 contains wird nicht unterstützt. Verwenden Sie stattdessen Key-Path-Lookups (zum Beispiel filter(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

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__iregex sind Nachschlagefunktionen in Azure SQL-Datenbank nicht verfügbar.
  • Der verbindende Nutzer muss eine Erlaubnis ALTER SETTINGS habensysadmin. Der Management-Befehl aktiviert CLR automatisch.
  • Die mssql App muss in INSTALLED_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:

  1. Aktiviert CLR auf dem Server (sp_configure 'clr enabled', 1), falls nicht bereits aktiviert.
  2. Setzt clr strict security auf 0 (erforderlich für SAFE Assemblies auf SQL Server 2017+).
  3. Erstellt die regex_clr Assembly aus der gebündelten DLL.
  4. Erzeugt die dbo.REGEXP_LIKE skalare 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.