Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
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-djangoMapsJSONFieldnaar Nvarchar(max). SQL Server 2025 introduceerde een native json-type, maar de Microsoft ODBC-driver voor SQL Server maakt dit niet beschikbaar. - De
containszoekopdracht wordt niet ondersteund. Gebruik in plaats daarvan key-path lookups (bijvoorbeeldfilter(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_togethergegenereerd. - 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
-
bulk_creatediereturn_rows_bulk_insert=Falsegeen ID's teruggeven. Vereist voor tabellen met triggers. Zie Bulkbewerkingen met mssql-django.
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
__regexopzoekopdrachten__iregexzijn niet beschikbaar in Azure SQL Database. - De verbindende gebruiker moet een of
ALTER SETTINGStoestemming hebbensysadmin. Het managementcommando schakelt CLR automatisch in. - De
mssqlapp moet inINSTALLED_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:
- Schakelt CLR in op de server in (
sp_configure 'clr enabled', 1) als het nog niet is ingeschakeld. - Zet zich in
clr strict securityop0(vereist voorSAFEassemblies op SQL Server 2017+). - Maakt de
regex_clrassembly aan uit de gebundelde DLL. - Maakt de
dbo.REGEXP_LIKEscalaire 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.