Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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.