mssql-django ile toplu işlemler

Bu makalede arka uç üzerinden SQL Server ile Django'nun bulk_create ve bulk_update yöntemlerinin mssql-django nasıl kullanılacağı açıklanmaktadır.

toplu_oluştur

Tek bir veritabanı işlemine birden çok kayıt eklemek için kullanın bulk_create :

from myapp.models import Product

products = [
    Product(name="Widget A", price=9.99),
    Product(name="Widget B", price=14.99),
    Product(name="Widget C", price=19.99),
]

Product.objects.bulk_create(products)

Toplu ekleme işleminden satırları döndürme

Varsayılan olarak, bulk_create SQL Server kullanılırken doldurulan birincil anahtarları döndürmez. Geri dönen birincil anahtarları etkinleştirmek için veritabanınızda return_rows_bulk_insertolarak True ayarlayınOPTIONS:

DATABASES = {
    "default": {
        "ENGINE": "mssql",
        "NAME": "<your-database>",
        "USER": "<your-username>",
        "PASSWORD": "<your-password>",
        "HOST": "<your-server>",
        "PORT": "1433",
        "OPTIONS": {
            "driver": "ODBC Driver 18 for SQL Server",
            "return_rows_bulk_insert": True,
        },
    },
}

Important

Herhangi bir hedef tabloda tetikleyici varsa return_rows_bulk_insert değerini False olarak ayarlayın (varsayılan). Satır döndürmek için kullanılan OUTPUT yan tümcesi, INSERT tetikleyicilerine sahip tablolarla uyumlu değildir.

bulk_update

Tek bir veritabanı işleminde birden çok kaydı güncelleştirmek için kullanın bulk_update :

from decimal import Decimal

from myapp.models import Product

products = Product.objects.filter(category="widgets")
for product in products:
    product.price = product.price * Decimal("1.10")  # 10% price increase

Product.objects.bulk_update(products, ["price"])

Varsayılan parametre

mssql-django Arka uç, geriye dönük uyumluluk için bulk_update üzerinde bir default parametresini hâlâ kabul eder, ancak bu parametre mevcut sürümlerde üretilen SQL’i etkilemez.

At least one of the result expressions in a CASE specification must be an expression other than the NULL constant.

Arka uç artık tüm-NULL güncelleme durumlarını default gerektirmeden işler.

Note

Eski sürümlerde, kullanımdan çıkarma default işlemi önceki örnekte gösterilen SQL Server hatasını tetikleyebilir. Bu parametre, yalnızca eski çağrı noktalarının bozulmasını önlemek için desteklenmeye devam ediyor.

Parti boyutu

Büyük veri kümelerinde, SQL deyimi başına satır sayısını sınırlamak için parametresini kullanın batch_size :

from myapp.models import Product

new_products = [Product(name=f"Widget {i}") for i in range(2000)]
Product.objects.bulk_create(new_products, batch_size=500)

products = list(Product.objects.filter(name__startswith="Widget "))
Product.objects.bulk_update(products, ["price"], batch_size=500)