Django alanı SQL Server tipi eşlemeleri

Bu makale, Django model alan tiplerinin arka uç kullanıldığında mssql-django SQL Server veri tipleriyle nasıl eşleştiğini belgelemektedir.

Alan tipi eşleme tablosu

Django sahası SQL Server türü Notlar
AutoField int ile IDENTITY(1,1) Otomatik olarak artırılan birincil anahtar.
BigAutoField bigint ile IDENTITY(1,1) 64-bit otomatik artan birincil anahtar.
SmallAutoField küçük int ile IDENTITY(1,1) 16-bit otomatik artıran birincil anahtar.
BooleanField bit Mağazalar 0 veya 1.
CharField(max_length=N) nvarchar(N) Unicode karakter verileri.
DateField date Zaman içermeyen tarih.
DateTimeField datetime2 Tarih ve saat, kısmal saniyelerle. Datetimeoffset (tarih zamanı) kullanır .USE_TZ=True
DecimalField(max_digits=M, decimal_places=D) sayısal (M, D) Sabit hassasiyetli ondalık sistem.
DurationField bigint Mikrosaniyeler olarak saklanıyor.
EmailField nvarchar(254) E-posta doğrulaması ile CharField.
FileField nvarchar(100) Dosya yolunu saklar.
FilePathField nvarchar(100) Dosya sistemi yolunu saklar.
FloatField float 64-bit kayan nokta (float(53)). SQL Server ayrıca ' eşanlamlısını double precisionda kabul eder.
IntegerField int 32 bit işaretli tamsayı.
BigIntegerField bigint 64-bit işaretli tam sayı.
SmallIntegerField smallint 16 bit işaretli tamsayı.
PositiveIntegerField int CHECK kısıtlaması >= 0ile.
PositiveBigIntegerField bigint CHECK kısıtlaması >= 0ile.
PositiveSmallIntegerField smallint CHECK kısıtlaması >= 0ile.
GenericIPAddressField nvarchar(39) IPv4 veya IPv6 adresi.
JSONField nvarchar(max) JSON ile kontrol kısıtlaması. SQL Server 2016+ gerektirir.
SlugField nvarchar(50) Slug doğrulama ile CharField.
TextField nvarchar(max) Sınırsız uzunlukta Unicode metni.
TimeField time Tarih olmadan zaman.
URLField nvarchar(200) URL doğrulama ile CharField.
UUIDField char(32) UUID 32 karakterlik altıgen dizisi olarak saklanıyor.
BinaryField varbinary(N) Ham ikili veri. Arka uç varbinary(N) yaymak için kullanılırmax_length.
ForeignKey Referans alan ile aynı Bir indeks ve FK kısıtlaması oluşturur.
OneToOneField Referans alan ile aynı Benzersiz bir indeks ve FK kısıtlaması oluşturur.
ManyToManyField Mevcut Değil Ara bir tablo oluşturur.

SQL Server'a özgü davranışlar

Bazı Django alan türleri, SQL Server ile kullanıldığında platforma özgü davranışa sahiptir.

AutoField sınırlaması

Bir model alanını göç zamanında veya bir noktaya AutoField değiştirmek desteklenmez. Birincil anahtar türünü değiştirmeniz gerekiyorsa, yeni bir alan oluşturun ve verileri manuel olarak taşıyın.

BooleanField ve bit

SQL Server bit tipi depolar 0 ve 1. Django bu değerlere eşlem True/False verir. NULL ile BooleanField(null=True)desteklenir.

DateTimeField ve saat dilimi desteği

Django ayarlarındayken USE_TZ=TrueDateTimeFielddatetimeoffset kullanarak saat dilimine göre datetime'ları kaydedersiniz. Ne zaman USE_TZ=Falsedatetime2 kullanır.

Sütun oluşturduktan sonra etkinleştirirseniz USE_TZ , mevcut datetime2 sütunlarını datetimeoffset'e manuel olarak taşımanız gerekir. Daha fazla bilgi için mssql-django'da Saat Dilimi Desteği sayfasına bakınız.

TextField vs CharField

SQL Server hem TextField de CharFieldnvarchar'a eşler. TextField nvarchar(max) kullanırken, CharFieldnvarchar(N) kullanır burada N .max_length

Tüm dize alanları nvarchar (Unicode) kullanır

Arka uç, mssql-django tüm Django dizi alanlarını (CharField, TextField, EmailField, URLFieldSlugField, ve diğerleri) Unicode dizi tipi olan nvarchar'a eşler. Bunun yerine varchar (Unicode olmayan) kullanmak için yerleşik bir seçenek yok.

Bu, tasarım gereğidir. Django'nun dizi işlemesi tamamen Unicode'dur ve nvarchar , dil veya kodlama fark etmeksizin tüm karakterlerin doğru şekilde saklanmasını sağlar. nvarchar kullanmak, karakter seti uyumsuzluklarından kaynaklanan veri kaybını önler.

Takas Seçenekler:

  • nvarchar , tek baytlı derlemelerde karakter başına 2 bayt kullanırken, varchar ise karakter başına 1 bayt kullanır.
  • Indeks anahtarı boyut sınırları uygulanır (kümelenmiş olmayan indeksler için 900 bayt). Bir nvarchar(450) sütunu 900 baytlık sınıra (450 x 2 bayt) ulaşırken, varchar(900) sütunu tek baytlı karakterlerle aynı sınıra ulaşır.
  • Verileriniz tamamen ASCII ise, nvarcharvarchar'a kıyasla depolamayı iki katına çıkarır.

Varchar sütunlarına ihtiyacınız varsa:

Eski veritabanları veya sıkı depolama gereksinimleri için, aşağıdaki ileri gitmeleri db_typeengelleyen özel bir alan oluşturun

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"

Caution

Varchar sütunlarının kullanılması, ASCII olmayan karakterler yazılırsa veri kaybı riski taşır. Bu yaklaşımı yalnızca sütunun sadece ASCII veriyi sakladığından emin olduğunda veya mevcut bir veritabanı şemasını eşleştirmeniz gerektiğinde kullanın.