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, 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-djangoHaritalarJSONFieldnvarchar(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
containsdesteklenmiyor. 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_togetherolarak ü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ı
-
bulk_createreturn_rows_bulk_insert=FalseKimlikleri geri göndermez. Tetikleyici tablolar için zorunludur. Bkz. Toplu işlemler MSSQL-django ile.
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
__regexyüzden Azure SQL Veritabanı'de hem de__iregexlookup'lar mevcut değil. - Bağlantı kuran kullanıcının iznine
sysadminveya iznine sahipALTER SETTINGSolması gerekir. Yönetim komutu CLR'yi otomatik olarak etkinleştirir. - Uygulama
mssqlmutlakaINSTALLED_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:
- Sunucuda (
sp_configure 'clr enabled', 1) CLR'yi etkinleştiriyor, eğer henüz etkin değilse. - Ayarlar
clr strict security0(SQL Server 2017 ve sonraki sürümlerdeki montajlar içinSAFEgereklidir). - Bundle DLL'den montajı oluşturur
regex_clr. - 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.