Operasi batch dengan mssql-django

Artikel ini menjelaskan cara menggunakan metode bulk_create dan bulk_update Django dengan SQL Server melalui backend mssql-django.

bulk_create

Gunakan bulk_create untuk menyisipkan beberapa rekaman dalam satu operasi database:

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)

Mengembalikan baris dari sisipan massal

Secara default, bulk_create tidak mengembalikan kunci primer yang diisi saat menggunakan SQL Server. Untuk mengaktifkan pengembalian kunci primer, atur return_rows_bulk_insert ke True di basis data OPTIONS Anda:

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

Atur return_rows_bulk_insert ke False (default) jika ada tabel target yang memiliki pemicu. Klausa OUTPUT yang digunakan untuk mengembalikan baris tidak kompatibel dengan tabel yang memiliki INSERT pemicu.

pembaruan massal

Gunakan bulk_update untuk memperbarui beberapa rekaman dalam satu operasi database:

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"])

Parameter bawaan

Backend mssql-django masih menerima parameter default pada bulk_update demi kompatibilitas dengan versi sebelumnya, tetapi parameter tersebut tidak memengaruhi SQL yang dihasilkan dalam versi saat ini.

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

Backend sekarang menangani semua kasusNULL pembaruan tanpa memerlukan default.

Note

Dalam versi yang lebih lama, menghilangkan default dapat memicu kesalahan SQL Server yang ditampilkan dalam contoh sebelumnya. Parameter tetap diterima hanya untuk menghindari melanggar situs panggilan yang lebih lama.

Ukuran batch

Untuk himpunan data besar, gunakan batch_size parameter untuk membatasi jumlah baris per pernyataan SQL:

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)