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 documenteert hoe Django-modelveldtypes worden gekoppeld aan SQL Server-datatypes wanneer de backend wordt mssql-django gebruikt.
Veldtype-mappingtabel
| Django-veld | SQL Server-type | Aantekeningen |
|---|---|---|
AutoField |
int met IDENTITY(1,1) |
Automatisch verhogende primaire sleutel. |
BigAutoField |
bigint met IDENTITY(1,1) |
64-bits auto-incrementerende primaire sleutel. |
SmallAutoField |
smallint met IDENTITY(1,1) |
16-bits automatisch verhogende primaire sleutel. |
BooleanField |
bit | Winkels 0 of 1. |
CharField(max_length=N) |
nvarchar(N) | Unicode-tekengegevens. |
DateField |
date | Datum zonder tijd. |
DateTimeField |
datetime2 | Datum en tijd met fracties van seconden. Gebruikt datetimeoffset wanneer USE_TZ=True. |
DecimalField(max_digits=M, decimal_places=D) |
numeriek(M, D) | Decimale met vaste precisie. |
DurationField |
bigint | Opgeslagen als microseconden. |
EmailField |
Nvarchar(254) | CharField met e-mailvalidatie. |
FileField |
nvarchar(100) | Slaat het bestandspad op. |
FilePathField |
nvarchar(100) | Slaat het bestandssysteempad op. |
FloatField |
float | 64-bits floating point (float(53)). SQL Server accepteert ook het synoniem double precision. |
IntegerField |
int | 32-bits ondertekend geheel getal. |
BigIntegerField |
bigint | 64-bits getekend geheel getal. |
SmallIntegerField |
smallint | 16-bits ondertekend geheel getal. |
PositiveIntegerField |
int | Met een CHECK-beperking.>= 0 |
PositiveBigIntegerField |
bigint | Met een CHECK-beperking.>= 0 |
PositiveSmallIntegerField |
smallint | Met een CHECK-beperking.>= 0 |
GenericIPAddressField |
Nvarchar(39) | IPv4- of IPv6-adres. |
JSONField |
nvarchar(max) | Met JSON checkbeperking. |
SlugField |
nvarchar(50) | CharField met slug-validatie. |
TextField |
nvarchar(max) | Unicode-tekst van onbeperkte lengte. |
TimeField |
time | Tijd zonder datum. |
URLField |
nvarchar(200) | CharField met URL-validatie. |
UUIDField |
char(32) | UUID opgeslagen als een hex-string van 32 tekens. |
BinaryField |
varbinair(N) | Ruwe binaire data. De backend zendt max_lengthvarbinair(N) uit. |
ForeignKey |
Hetzelfde als het gerefereerde veld | Maakt een index- en FK-beperking aan. |
OneToOneField |
Hetzelfde als het gerefereerde veld | Maakt een unieke index en FK-beperking aan. |
ManyToManyField |
N/A | Maakt een tussentabel aan. |
SQL Server-specifieke gedragingen
Sommige Django-veldtypes vertonen platformspecifiek gedrag wanneer ze worden gebruikt met SQL Server.
AutoField-beperking
Het wijzigen van een modelveld van of naar AutoField tijdens de migratie wordt niet ondersteund. Als je het primaire sleuteltype moet wijzigen, maak dan een nieuw veld aan en migreer data handmatig.
BooleanField en bit
SQL Server bittype-opslagen 0 en .1 Django wordt naar deze waarden gemapt True/False .
NULL wordt ondersteund met BooleanField(null=True).
DateTimeField en tijdzone-ondersteuning
Gebruik USE_TZ=True in je Django-instellingen DateTimeFielddatetimeoffset om tijdsmomenten op te slaan die je in de tijdzone bewust bent. Wanneer USE_TZ=False, gebruikt het datetime2.
Als je na het aanmaken van kolommen inschakelt USE_TZ , moet je bestaande datetime2-kolommen handmatig migreren naar datetimeoffset. Voor meer informatie, zie Time zone support in mssql-django.
TextField versus CharField
SQL Server koppelt zowel TextField als CharField aan nvarchar.
TextField gebruikt nvarchar(max) terwijl CharField gebruikt nvarchar(N) waarbij N is max_length.
Alle stringvelden gebruiken nvarchar (Unicode)
De mssql-django backend koppelt alle Django-stringvelden (CharField, TextField, EmailField, URLField, SlugField, en andere) naar nvarchar, het Unicode-stringtype. Er is geen ingebouwde optie om varchar (niet-Unicode) te gebruiken.
Dit is standaard. De stringverwerking van Django is gedurende het hele proces Unicode, en nvarchar zorgt ervoor dat alle tekens correct worden opgeslagen, ongeacht de taal of codering. Het gebruik van nvarchar voorkomt dataverlies door mismatches in tekensets.
Afwegingen:
- nvarchar gebruikt 2 bytes per teken, vergeleken met 1 byte per teken voor varchar met eenbyte-collaties.
- Limieten voor indexsleutelgrootte gelden (900 bytes voor niet-geclusterde indexen). Een nvarchar(450) -kolom bereikt de limiet van 900 bytes (450 x 2 bytes), terwijl een kolom varchar(900) dezelfde limiet bereikt met enkelbytetekens.
- Als je data uitsluitend ASCII is, verdubbelt nvarchar opslag vergeleken met varchar.
Als je varchar-kolommen nodig hebt:
Voor legacy-databases of strikte opslagvereisten, maak een aangepast veld dat het volgende overschrijft db_type:
from django.db import models
class VarcharField(models.CharField):
def db_type(self, connection):
return f"varchar({self.max_length})"
class LegacyProduct(models.Model):
sku = VarcharField(max_length=50) # Creates varchar(50) instead of nvarchar(50)
class Meta:
managed = False # For existing tables
db_table = "LegacyProduct"
Waarschuwing
Het gebruik van varchar-kolommen brengt het risico op dataverlies als niet-ASCII-tekens worden geschreven. Gebruik deze aanpak alleen als je zeker weet dat de kolom alleen ASCII-data opslaat, of wanneer je een bestaand databaseschema moet matchen.