mssql-django'da kısıtlamalar ve desteklenmeyen özellikler

Bu makale, SQL Server, Azure SQL Veritabanı, Azure SQL Yönetilen Örneği ve Microsoft Fabric'te SQL veritabanı ile kullanıldığında arka uçun mssql-django sınırlamalarını listeler.

Django özellik sınırlamaları

Aşağıdaki Django özellikleri desteklenmiyor veya arka uç ile sınırlı destekleniyor mssql-django :

Feature Statü Details
Avg ile DurationField Desteklenmiyor Aggregate Avg üzerinde DurationFieldçalışmaz.
__regex ve __iregex aramaları Kurulum gerektirir SQL Server veya Azure SQL Yönetilen Örneği'a CLR assembly yüklendikten sonra desteklenir. Azure SQL Veritabanı CLR assemble'ları desteklemiyor. Regex araştırmalarını kur olarak bakınız.
DISTINCT ON Desteklenmiyor SQL Server madde desteği DISTINCT ON vermiyor. Kullanım .values().distinct() veya alt sorgular.
Subquery içinde ORDER BY Desteklenmiyor Alt sorgu ifadelerine göre sıralama çalışmayabilir.
Veritabanı düzeyinde CASCADE Sınırlı Bazı SET NULL işlemler SET DEFAULT manuel migrasyon SQL gerektirebilir.
is_dst içinde Trunc/Extract Desteklenmiyor is_dst parametre (yaz saati geçişlerinde belirsiz zamanları çözmek için kullanılır) ve Extract()Trunc() desteklenmez. DST-farkında sorgular için ham SQL'de kullanım AT TIME ZONE .
Yüzer nokta notası Sınırlı Kayan nokta Avg agregaları, SQL Server'ın float type davranışı nedeniyle PostgreSQL'e kıyasla hassasiyet kaybedebilir. Örneğin, 0.1 ve 0.2 ortalamaları 0.1500000000000000000000222 verebilir, tam olarak 0.15 değil. Kritik finansal hesaplamalar için kullanılırDecimalField.Cast(avg_expr, output_field=DecimalField())
Açıklama/var ORDER BY Desteklenmiyor Annotate veya var ifadeleri kullanmak order_by işe yaramayabilir.
Sağ el güç ve tarih zamanı aritmetiği Desteklenmiyor Sağ el güç işlemleri (örneğin, F('value') ** 2 çalışıyor ama 2 ** F('value') başarısız oluyor) ve bölme ile timedelta desteklenmiyor.
Zaman dilimleri ve zaman deltaları Sınırlı Zaman dilimleri ve zaman dilimleri tam olarak desteklenmiyor. mssql-django'da Saat Bölgesi desteğine bakınız.
NthValue pencere fonksiyonu Desteklenmiyor SQL Server NTH_VALUE(). , LAST_VALUE, veya alt sorgu kullanınFIRST_VALUE.
ignore_conflicts içinde bulk_create Desteklenmiyor bulk_create(objs, ignore_conflicts=True) desteklenmez. SQL Server'ın PostgreSQL'in ON CONFLICT DO NOTHINGkarşılığı yoktur.
JSONField contains arama Desteklenmiyor Bunun yerine anahtar yolu araştırmaları kullanın (örneğin, filter(metadata__color="blue")). JSONField sınırlamalarına bakınız.
select_for_update(of=(...)) Desteklenmiyor SQL Server, belirli tabloları kilitlemeyi desteklemiyor. Arka uç .NotSupportedError Bkz. İşlem yönetimi.

Geçiş sınırlamaları

Sınırlama Details
Alter AutoField Bir alanı (IDENTITYsütun) olarak değiştiremiyor AutoField . Yeni bir tablo oluşturmayı gerektirir.
Yabancı anahtarlarla yeniden adlandırma Yabancı anahtar kısıtlamaları olan bir sütunun adını değiştirmek başarısız olabilir. SeparateDatabaseAndState adresini kullanın.
AddConstraint / RemoveConstraint Çatışmalar Bazı kısıtlama işlemleri çakışabilir. Ayrı göçlerde başvurun.
Tarih çıkarma işlemleri ExtractYear, ExtractMonth, ve benzeri operasyonlar sınırlı tzinfo destek sağlar.

JSONField sınırlamaları

  • mssql-django Haritalar JSONFieldnvarchar(max) ile eşleştirilir. SQL Server 2025 yerel bir json tipi tanıttı, ancak Microsoft ODBC Driver for SQL Server bunu göstermiyor.
  • Arama contains desteklenmiyor. Bunun yerine anahtar yolu araştırmaları kullanın (örneğin, filter(metadata__color="blue")).
  • Alıntılanan dizi değerleri ekstra tırnak ile döner (örneğin, '"value"' yerine 'value').
  • Bazı iç içe sormalar PostgreSQL'den farklı davranabilir.
  • Daha fazla bilgi için JSONField with SQL Server sayfasına bakınız.

InspectDB sınırlamaları

  • Bileşik birincil anahtarlar otomatik unique_together olarak üretilmez.
  • Bazı SQL Server'a özgü sütun türleri, genel Django alanlarıyla eşlenebilir.
  • Oluşturulan modelleri manuel olarak inceleyin ve ayarlayın.
  • Daha fazla bilgi için inceltilmiş modelleri geri mühendislik modellerine bakınız.

SQL Server parametre sınırı

SQL Server her sorguyu maksimum 2.100 parametreyle sınırlar. Bu sınır, büyük değer listeleriyle parametreli sorgular üreten Django işlemlerini etkiler:

Operation Sınırı nasıl aşıyor
filter(field__in=large_list) Her liste öğesi bir parametre haline gelir. Arka uç, 2.048'den fazla öğeyi otomatik olarak geçici bir tabloya optimize eder.
prefetch_related() Her ebeveyn nesne kimliği, ilgili sorgu WHERE IN maddesinde bir parametre olur. 2.048 ID'den fazla olduğunda otomatik optimize filter(field__in=...) edildi.
bulk_create() Her nesnenin her alanı bir parametre haline gelir. 10 alan ve 250 nesneye sahip bir model, 2.500 parametre üretir.
bulk_update() Her alan, her nesne için iki parametre kullanır (biri PK eşleşmesi için, biri değer için).
Q() birçok koşulla Zincirlenmiş Q nesnelerdeki her değer bir parametre olur.

Toptan batch_size operasyonlara ve büyük IN sorgulamalara odaklanın. Çözümler için Performans ayarı sayfasına bakınız.

Toptan operasyon sınırlamaları

Test çerçevesi sınırlamaları

--keepdb Yönetilen kimlik doğrulaması (ActiveDirectoryMsi) kullanılırken gereklidir çünkü test çalıştırıcısı bu doğrulama yöntemiyle veritabanları oluşturamaz veya yok edemez.

Daha fazla bilgi için bkz. Test Django uygulamaları with SQL Server.

Versiyona özgü notlar

MSSQL-django versiyonu Notlar
1.7.3 Başka ActiveDirectoryMsimodlar için Authentication= düzeltildiFA001. Alt sınıflara DatabaseWrapper sabitlendi KeyError (1.7.1'den regresyon).
1.7.2 Datetimeoffset için sabit zaman dilimi işlemesi ve Now()USE_TZ=Trueile . Django 4.0 ve sonrası için uyumluluk düzeltildi .explain() .
1.7.1 SQL veritabanı Fabric'te (EngineEdition 12) düzeltin. İnenen indeks AlterField düzeltmesi.
1.7 ODBC Sürücüsü 18 varsayılan özelliktir. Django 6.0, Python 3.14, SQL Server 2025 desteği eklendi.
1.6 Django 5.1 ve 5.2 desteği. Geliştirilmiş JSON işlevselliği.
1.5 AutoField, parametre biçimlendirme ve şema sorguları için hata düzeltmeleri.
1.4 Django 5.0 desteği. db_comment destek.
1.3 Django 4.2 desteği.
1.2 Django 4.1 desteği. Saat dilimi desteği. return_rows_bulk_insert Opsiyon. SQL Server 2022 desteği.
1.1 Django 3.2 ve 4.0 desteği.

Django versiyonuna özel notlar

Django versiyonu Notlar
5.1 inspectdb Bileşik birincil anahtarlara sahip tabloları inceleyebilir, ancak bunlar için tam model tanımları üretmez.
5.2 CompositePrimaryKey destek kısmi. inspectdb hala manuel düzeltmeler gerektiriyor, alt sorgularla tuple karşılaştırması Django 5.2.4 ve daha sonraki sürümleri gerektiriyor ve bazı geçişler ile JSONField bulk/CASE güncelleme yollarında test hariç tutulmaları hala bulunduğunda gereklidir. Daha fazla bilgi için GitHub deposunu ziyaret edin.
6.0 Python 3.12 ve daha sonraki sürümleri gerektirir. Tüm 5.2 sınırlamaları geçerlidir. Arka uç, 6.0 API değişikliklerinin tamamını şeffaf bir şekilde yönetiyor.

Regex aramalarını kur

Arka mssql-django uç Django __regex ve __iregex lookup'ları destekler, ancak tek seferlik kurulum adımı gerektirir. Arka uç, SQL Server'a bir dbo.REGEXP_LIKE fonksiyon sağlayan bir CLR assembly (regex_clr.dll) gönderir.

Prerequisites

  • CLR entegrasyonunu destekleyen bir SQL Server örneği. On-premises SQL Server ve Azure SQL Yönetilen Örneği CLR'i destekliyor. Azure SQL Veritabanı CLR assemble'ları desteklemiyor, bu __regex yüzden Azure SQL Veritabanı'de hem de __iregex lookup'lar mevcut değil.
  • Bağlantı kuran kullanıcının iznine ALTER SETTINGS veya iznine sahip sysadmin olması gerekir. Yönetim komutu CLR'yi otomatik olarak etkinleştirir.
  • Uygulama mssql mutlaka INSTALLED_APPS.

CLR montajını kur

Yönetim komutunu çalıştırın, veritabanınızın adını verin:

python manage.py install_regex_clr <your-database-name>

Bu komut aşağıdaki adımları gerçekleştirir:

  1. Sunucuda (sp_configure 'clr enabled', 1) CLR'yi etkinleştiriyor, eğer henüz etkin değilse.
  2. Sets clr strict security to 0 (SQL Server 2017+ için assemblerlar için gerekliSAFE).
  3. Bundle DLL'den montajı oluşturur regex_clr .
  4. Skaler fonksiyonu oluşturur dbo.REGEXP_LIKE .

Caution

İmzasız CLR montajlarının yüklenmesine izin vermek clr strict security0 . Bu zorunludur çünkü paket regex_clr.dll imzalanmamıştır. Bu değişikliği üretim sunucularında komutu çalıştırmadan önce DBA ile görüşün. Ayar, veritabanı başına değil, sunucu genelinde geçerlidir.

Regex araştırmaları kullanın

Montajı kurduktan sonra sorgu setlerinde ve __iregex içinde şunları kullanın__regex:

# Case-sensitive regex
products = Product.objects.filter(name__regex=r"^Widget \d+$")

# Case-insensitive regex
products = Product.objects.filter(name__iregex=r"^widget \d+$")

Arka uç bu aramaları 'ye çeviriyor.dbo.REGEXP_LIKE(column, pattern, case_flag) = 1

Note

Komutu veritabanı başına bir kez çalıştırmalısınız install_regex_clr . Veritabanı düşürülür ve yeniden oluşturulursa (örneğin, test sırasında), komutu tekrar çalıştırın.