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.
DB_CASCADE, DB_SET_NULL, DB_SET_DEFAULT Desteklenmiyor Veritabanı düzeyinde referans eylemleri Django 6.1'de eklendi. SQL Server, aynı tabloya birden fazla kaskad yolu olan yabancı anahtar grafikleri reddeder (1785 hatası), bu yüzden bu özellik için hiçbir SQL Server sürümünde yerel yol yoktur. Bu değerlerden birinin kullanılması Django sistem kontrolü fields.E324oluşturur. Bunun yerine standart Django seviyesini on_delete kullanın.
BitAnd, BitOr, BitXor Desteklenmiyor Bitwise toplamları Django 6.1'de eklendi. SQL Server'ın yerel bitli toplama fonksiyonu yoktur ve arka uç bunları emüle etmez, bu yüzden bu agregalar NotSupportedError.
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.
QuerySet.iterator() MARS olmadan Sınırlı mssql-python yolu, Çoklu Aktif Sonuç Kümelerini (MARS) etkinleştirmez. Pyodbc yolunda, MARS varsayılan olarak Windows'ta Microsoft ODBC sürücüsüyle etkinleştirilmiş ve MARS_Connectionextra_params içinde büyük harf duyarsızlığı ile kabul edilir. MARS kapalı olduğunda, QuerySet.iterator() tüm sonucu bellekte tampon yapar ve sonra vericilik verir. chunk_size bu davranışı değiştirmez.
NthValue pencere fonksiyonu Desteklenmiyor SQL Server NTH_VALUE(). , FIRST_VALUE, veya alt sorgu kullanınLAST_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ı (AutoFieldsütun) olarak değiştiremiyor IDENTITY . 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
2.0 Python 3.10'dan 3.14'e kadar, Django 5.2, 6.0 ve 6.1, SQL Server 2017, 2019, 2022 ve 2025, Azure SQL Veritabanı, Azure SQL Yönetilen Örneği ve Microsoft Fabric'te SQL database desteğini destekler. mssql-python sürücü yolunu ekliyor ve pyodbc'yi varsayılan olarak tutuyor. Daha fazla bilgi için, mssql-django için veritabanı sürücüsünü seç sayfasına bakınız.
1.8.0 Bu sürüm, Python 3.8, Python 3.9 veya 5.2'den önceki Django sürümleri gerektiren projeler için kullanın.

Test edilen mssql-django 2.0 kombinasyonları Django 5.2 ile Python 3.10 ile 3.13 ve Django 6.0 veya 6.1 ile Python 3.12'den 3.14'e kadar olan versiyonlardır. Backend, tanınmayan yeni bir SQL Server ana sürümüne bağlanırsa, sürüm doğrulamasında başarısız olmak yerine bildiği en son yetenek setini kullanır. Bu davranış, test edilmemiş özelliklerin desteklendiğini ilan etmez.

Django versiyonuna özel notlar

Django versiyonu Notlar
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.
6.1 Python 3.12 ve daha sonraki sürümleri gerektirir. Tüm 6.0 sınırlamaları geçerlidir. 1.8.0 ve daha sonraki sürümleri gerektirir mssql-django . Veritabanı düzeyinde referans işlemleri (DB_CASCADE, DB_SET_NULL, DB_SET_DEFAULT) ve bitli toplamlar (BitAnd, BitOr, BitXor) desteklenmez.

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 regex_clr.dll fonksiyon sağlayan bir CLR assembly (dbo.REGEXP_LIKE) 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 sysadmin veya iznine sahip ALTER SETTINGS 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 <database>

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. Ayarlar clr strict security0 (SQL Server 2017 ve sonraki sürümlerdeki montajlar için SAFE gereklidir).
  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 __regex içinde şunları kullanın__iregex:

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

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

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

Important

dbo.REGEXP_LIKE desendeki kelimenin tam anlamıyla boşluk alanı görmezden geliyor. Bir ^Widget \d+$ desen gibi bir desen, sanki 'de varmış ^Widget\d+$gibi, bu yüzden değere Widget 42karşı satır döndürmez. Boşlukları karakter sınıfı olarak \s veya olarak yaz, örneğin [ ]. Hiçbir şey yükselmiyor, bu yüzden boş sonuç veri sorunu gibi görünüyor.

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.