Django-Feld-zu-SQL Server-Typzuordnungen

Dieser Artikel dokumentiert, wie Django-Modellfeldtypen bei der Nutzung des mssql-django Backends auf SQL Server-Datentypen abgebildet werden.

Feldtyp-Abbildungstabelle

Django-Feld SQL Server-Typ Hinweise
AutoField int mit IDENTITY(1,1) Automatisch inkrementierender Primärschlüssel.
BigAutoField Bigotte mit IDENTITY(1,1) 64-Bit-automatisch-inkrementierender Primärschlüssel.
SmallAutoField smallint mit IDENTITY(1,1) 16-Bit-automatisch-inkrementierender Primärschlüssel.
BooleanField bit Läden 0 oder 1.
CharField(max_length=N) nvarchar(N) Unicode-Zeichendaten.
DateField date Datum ohne Uhrzeit.
DateTimeField datetime2 Datum und Uhrzeit mit Bruchteilen von Sekunden. Verwendet datetimeoffset, wenn USE_TZ=True.
DecimalField(max_digits=M, decimal_places=D) numerisch(M, D) Dezimalgenauigkeit mit fester Genauigkeit.
DurationField bigint Gespeichert als Mikrosekunden.
EmailField nvarchar(254) CharField mit E-Mail-Validierung.
FileField nvarchar(100) Speichert den Dateipfad.
FilePathField nvarchar(100) Speichert den Dateisystempfad.
FloatField schweben 64-Bit-Gleitkomma (Gleitkomma) (Float(53)). SQL Server akzeptiert ebenfalls das Synonym double precision.
IntegerField int 32-Bit-Ganzzahl mit Vorzeichen.
BigIntegerField bigint 64-Bit-signierte Ganzzahl.
SmallIntegerField smallint 16-Bit-Ganzzahl mit Vorzeichen.
PositiveIntegerField int Mit einer CHECK-Einschränkung >= 0.
PositiveBigIntegerField bigint Mit einer CHECK-Einschränkung >= 0.
PositiveSmallIntegerField smallint Mit einer CHECK-Einschränkung >= 0.
GenericIPAddressField Nvarchar(39) IPv4- oder IPv6-Adresse.
JSONField nvarchar(max) Mit JSON-Check-Constraint.
SlugField nvarchar(50) CharField mit Slug-Validierung.
TextField nvarchar(max) Unbegrenzter Unicode-Text.
TimeField time Zeit ohne Datum.
URLField nvarchar(200) CharField mit URL-Validierung.
UUIDField char(32) UUID als 32-Zeichen-Hex-String gespeichert.
BinaryField varbinär(N) Unformatierte Binärdaten. Das Backend emittiert max_lengthvaribinär(N).
ForeignKey Dasselbe wie das referenzierte Feld Erzeugt eine Index- und FK-Constraint.
OneToOneField Dasselbe wie das referenzierte Feld Erzeugt einen eindeutigen Index und eine FK-Bedingung.
ManyToManyField N/A Erstellt eine Zwischentabelle.

SQL Server-spezifische Verhaltensweisen

Einige Django-Feldtypen verhalten sich plattformspezifisch, wenn sie mit SQL Server verwendet werden.

AutoField-Einschränkung

Das Ändern eines Modellfeldes von oder zu AutoField zur Migration wird nicht unterstützt. Wenn du den Primärschlüsseltyp ändern musst, erstelle ein neues Feld und migriere die Daten manuell.

BooleanField und Bit

SQL Server Bittypspeicher0 und 1. Django bildet diese Werte ab.True/False NULL wird mit BooleanField(null=True)unterstützt.

Unterstützung für DateTimeField und Zeitzonen

In USE_TZ=True deinen Django-Einstellungen nutzt man DateTimeFielddatetimeoffoff, um zeitzonenbewusste Datetimes zu speichern. Wenn USE_TZ=False, verwendet er datetime2.

Wenn Sie nach der Erstellung von Spalten aktivieren USE_TZ , müssen Sie bestehende datetime2-Spalten manuell zu datetimeoffset migrieren. Weitere Informationen finden Sie unter Zeitzonenunterstützung in mssql-django.

TextField vs. CharField

SQL Server ordnet sowohl als auch TextFieldCharFieldnvarchar ab. TextFieldverwendet nvarchar(max), während CharFieldnvarchar(N) verwendet, wobei N .max_length

Alle Zeichenkettenfelder verwenden nvarchar (Unicode)

Das mssql-django Backend ordnet alle Django-String-Felder (CharField, TextField, EmailField, , URLField, SlugField, und andere) nvarchar, dem Unicode-String-Typ, zu. Es gibt keine eingebaute Option, stattdessen Varchar (nicht Unicode) zu verwenden.

Dies ist beabsichtigt. Djangos Zeichenkettenhandhabung ist durchgehend Unicode, und nvarchar stellt sicher, dass alle Zeichen unabhängig von Sprache oder Codierung korrekt gespeichert werden. Die Verwendung von nvarchar vermeidet Datenverlust durch Zeichensatz-Fehlanpassungen.

Abwägungen:

  • nvarchar verwendet 2 Bytes pro Zeichen, verglichen mit 1 Byte pro Zeichen bei Varchar bei Einzel-Byte-Zusammenstellungen.
  • Es gelten Größenbeschränkungen für Indexschlüssel (900 Bytes für nicht-geclusterte Indexe). Eine nvarchar(450)- Spalte erreicht die 900-Byte-Grenze (450 x 2 Bytes), während eine varchar(900)- Spalte dieselbe Grenze mit Einzelbyte-Zeichen erreicht.
  • Wenn deine Daten ausschließlich ASCII sind, verdoppelt nvarchar den Speicher im Vergleich zu varchar.

Wenn du Varchar-Spalten brauchst:

Für Altdatenbanken oder strenge Speicheranforderungen erstellen Sie ein benutzerdefiniertes Feld, das überschreibt 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"

Vorsicht

Die Verwendung von Varchar-Spalten birgt das Risiko eines Datenverlusts, wenn nicht-ASCII-Zeichen geschrieben werden. Verwenden Sie diesen Ansatz nur, wenn Sie sicher sind, dass die Spalte nur ASCII-Daten speichert oder wenn Sie ein bestehendes Datenbankschema abgleichen müssen.