Django-veld-naar-SQL Server-type mappings

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.