Beperkingen en niet-ondersteunde functies in mssql-django

Dit artikel vermeldt beperkingen van de mssql-django backend wanneer deze wordt gebruikt met SQL Server, Azure SQL Database, Azure SQL Managed Instance en SQL Database in Microsoft Fabric.

Beperkingen van Django-functies

De volgende Django-functies worden niet ondersteund of hebben beperkte ondersteuning in de mssql-django backend:

Eigenschap Status Details
Avg met DurationField Niet ondersteund Aggregate Avg werkt niet op DurationField.
__regexen opzoekopdrachten __iregex Setup vereist Ondersteund na installatie van de CLR-assembly op SQL Server of Azure SQL Managed Instance. Azure SQL Database ondersteunt geen CLR-assemblies. Zie Regex opzetten lookups.
DISTINCT ON Niet ondersteund SQL Server ondersteunt DISTINCT ON geen clausules. Gebruik .values().distinct() of subqueries.
Subquery in ORDER BY Niet ondersteund Ordenen op subquery-expressies werkt mogelijk niet.
Databaseniveau CASCADE Limited Sommige SET NULL en SET DEFAULT operaties vereisen handmatige migratie van SQL.
is_dst in Trunc/Extract Niet ondersteund is_dst parameter (gebruikt om ambigue tijden tijdens overgangen in zomertijd op te lossen) in Extract() en Trunc() wordt niet ondersteund. Gebruik AT TIME ZONE in raw SQL voor DST-bewuste queries.
Floating-point annotatie Limited Floating point-aggregaten Avg kunnen aan precisie verliezen ten opzichte van PostgreSQL door het float-achtige gedrag van SQL Server. Bijvoorbeeld, het gemiddelde van 0,1 en 0,2 kan 0,1500000000000000002222 opleveren in plaats van precies 0,15. Gebruik DecimalField of Cast(avg_expr, output_field=DecimalField()) voor kritieke financiële berekeningen.
Annoteren/bestaat in ORDER BY Niet ondersteund Het gebruik van annotate- of existent-expressies in order_by werkt misschien niet.
Rechterhand macht en date-time rekenkunde Niet ondersteund Rechterhandige stroombewerkingen (bijvoorbeeld F('value') ** 2 werkt maar 2 ** F('value') faalt) en deling met timedelta worden niet ondersteund.
Tijdzones en tijddelta's Limited Tijdzones en tijdsdelta's worden niet volledig ondersteund. Zie tijdzone-ondersteuning in mssql-django.
NthValue Vensterfunctie Niet ondersteund SQL Server ondersteunt NTH_VALUE()dat niet. Gebruik FIRST_VALUE, LAST_VALUE, of een subquery.
ignore_conflicts in bulk_create Niet ondersteund bulk_create(objs, ignore_conflicts=True) wordt niet ondersteund. SQL Server heeft geen equivalent van PostgreSQL'sON CONFLICT DO NOTHING.
JSONField-opzoeking contains Niet ondersteund Gebruik in plaats daarvan key-path lookups (bijvoorbeeld filter(metadata__color="blue")). Zie beperkingen van JSONField.
select_for_update(of=(...)) Niet ondersteund SQL Server ondersteunt het niet vergrendelen van specifieke tabellen. De backend verhoogt NotSupportedError. Zie Transactiebeheer.

Migratiebeperkingen

Limitation Details
Alter AutoField Je kunt een veld niet veranderen naar of van AutoField (IDENTITY kolom). Vereist het aanmaken van een nieuwe tabel.
Hernoem met vreemde sleutels Het hernoemen van een kolom met vreemde sleutelbeperkingen kan mislukken. Gebruik SeparateDatabaseAndState.
AddConstraint / RemoveConstraint Conflicten Sommige constraint-operaties kunnen conflicteren. Solliciteer in aparte migraties.
Date-extractoperaties ExtractYear, ExtractMonth, en vergelijkbare operaties hebben beperkte tzinfo ondersteuning.

JSONField beperkingen

  • mssql-djangoMaps JSONField naar Nvarchar(max). SQL Server 2025 introduceerde een native json-type, maar de Microsoft ODBC-driver voor SQL Server maakt dit niet beschikbaar.
  • De contains zoekopdracht wordt niet ondersteund. Gebruik in plaats daarvan key-path lookups (bijvoorbeeld filter(metadata__color="blue")).
  • Quoteerde stringwaarden geven extra aanhalingstekens terug (bijvoorbeeld '"value"' in plaats van 'value').
  • Sommige geneste opzoekopdrachten kunnen anders werken dan op PostgreSQL.
  • Voor meer informatie, zie JSONField met SQL Server.

Beperkingen van inspectDB

  • Samengestelde primaire sleutels worden niet automatisch unique_together gegenereerd.
  • Sommige SQL Server-specifieke kolomtypes kunnen worden gekoppeld aan generieke Django-velden.
  • Bekijk en pas gegenereerde modellen handmatig aan.
  • Voor meer informatie, zie Reverse-engineer models with inspectdb.

SQL Server parameterlimiet

SQL Server beperkt elke query tot maximaal 2.100 parameters. Deze limiet beïnvloedt Django-operaties die geparametriseerde queries genereren met grote waardelijsten:

Operation Hoe het de limiet bereikt
filter(field__in=large_list) Elk lijstitem wordt een parameter. De backend optimaliseert automatisch meer dan 2.048 items in een tijdelijke tabel.
prefetch_related() Elke parent object-ID wordt een parameter in de clausule WHERE IN van de gerelateerde query. Auto-geoptimaliseerd, zoals filter(field__in=...) wanneer er meer dan 2.048 ID's zijn.
bulk_create() Elk veld van elk object wordt een parameter. Een model met 10 velden en 250 objecten genereert 2.500 parameters.
bulk_update() Elk veld gebruikt twee parameters per object (één voor de PK-overeenkomst, één voor de waarde).
Q() met veel voorwaarden Elke waarde in gekoppelde Q objecten wordt een parameter.

Stel in batch_size op bulkoperaties en chunk large IN queries. Zie Performance tuning voor oplossingen.

Beperkingen van bulkoperaties

Beperkingen van testframeworks

--keepdb is vereist bij het gebruik van beheerde identiteitsauthenticatie (ActiveDirectoryMsi) omdat de testrunner databases niet kan aanmaken of vernietigen met die authenticatiemethode.

Voor meer informatie, zie Test Django apps met SQL Server.

Versie-specifieke opmerkingen

mssql-django versie Aantekeningen
1.7.3 Opgelost FA001 voor Authentication= andere modi dan ActiveDirectoryMsi. Vast KeyError op subclassed DatabaseWrapper (regressie van 1.7.1).
1.7.2 Vaste tijdzone-afhandeling voor datetimeoffset en Now() met USE_TZ=True. Verbeterde .explain() compatibiliteit voor Django 4.0 en later.
1.7.1 SQL-database in Fabric (EngineEdition 12) fix. Correctie van dalende index AlterField .
1.7 ODBC Driver 18 is de standaard. Django 6.0, Python 3.14, SQL Server 2025 ondersteuning toegevoegd.
1.6 Django 5.1 en 5.2 ondersteuning. Verbeterde JSON-functionaliteit.
1.5 Bugfixes voor AutoField, parameteropmaak en schema-query's.
1.4 Django 5.0 ondersteuning. db_comment ondersteuning.
1.3 Django 4.2 ondersteuning.
1,2 Django 4.1 ondersteuning. Tijdzone-ondersteuning. return_rows_bulk_insert optie. SQL Server 2022 ondersteuning.
1,1 Django 3.2 en 4.0 ondersteuning.

Django-versie-specifieke notities

Django-versie Aantekeningen
5.1 inspectdb Kan tabellen inspecteren met samengestelde primaire sleutels, maar genereert geen volledige modeldefinities voor hen.
5.2 CompositePrimaryKey De steun is gedeeltelijk. inspectdb vereist nog steeds handmatige fixes, tuple-vergelijking met subqueries vereist Django 5.2.4 en latere versies, en enige migratie plus JSONField bulk/CASE WHEN updatepaden nog testuitsluitingen hebben. Voor meer informatie, zie de GitHub-repository.
6.0 Vereist Python 3.12 en latere versies. Alle beperkingen in 5.2 gelden. De backend verwerkt alle 6.0 API-wijzigingen transparant.

Stel regex-opzoekingen in

De mssql-django backend ondersteunt Django's __regex en __iregex lookups, maar die vereisen een eenmalige opstellingsstap. De backend levert een CLR-assembly (regex_clr.dll) die een dbo.REGEXP_LIKE functie aan SQL Server biedt.

Prerequisites

  • Een SQL Server-instantie die CLR-integratie ondersteunt. On-premises SQL Server en Azure SQL Managed Instance ondersteunen CLR. Azure SQL Database ondersteunt geen CLR-assemblies, dus __regex opzoekopdrachten __iregex zijn niet beschikbaar in Azure SQL Database.
  • De verbindende gebruiker moet een of ALTER SETTINGS toestemming hebbensysadmin. Het managementcommando schakelt CLR automatisch in.
  • De mssql app moet in INSTALLED_APPS.

Installeer de CLR-assemblage

Voer het managementcommando uit en geef je databasenaam door:

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

Dit commando voert de volgende stappen uit:

  1. Schakelt CLR in op de server in (sp_configure 'clr enabled', 1) als het nog niet is ingeschakeld.
  2. Zet zich in clr strict security op 0 (vereist voor SAFE assemblies op SQL Server 2017+).
  3. Maakt de regex_clr assembly aan uit de gebundelde DLL.
  4. Maakt de dbo.REGEXP_LIKE scalaire functie aan.

Waarschuwing

Door op 0 te zetten clr strict security kunnen ongesigneerde CLR-assemblies laden. Dit is vereist omdat het gebundelde regex_clr.dll niet ondertekend is. Bespreek deze wijziging met je DBA voordat je het commando uitvoert op productieservers. De instelling geldt voor de hele server, niet per database.

Gebruik regex-opzoekingen

Na installatie van de assembly, gebruik __regex en __iregex in querysets:

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

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

De backend vertaalt deze lookups naar dbo.REGEXP_LIKE(column, pattern, case_flag) = 1.

Note

Je moet het install_regex_clr commando één keer per database uitvoeren. Als de database wordt verwijderd en opnieuw wordt aangemaakt (bijvoorbeeld tijdens testen), voer dan het commando opnieuw uit.