Hromadné operace s mssql-django

Tento článek vysvětluje, jak používat metody bulk_create a bulk_update v Django se serverem SQL Server prostřednictvím backendu mssql-django.

hromadné_vytvoření

Slouží bulk_create k vložení více záznamů do jedné databázové operace:

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)

Vrátit řádky po hromadném vložení

Ve výchozím nastavení bulk_create nevrací vyplněné primární klíče při použití SQL Server. Pokud chcete povolit vrácení primárních klíčů, nastavte return_rows_bulk_insert v True databázi OPTIONS:

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

Pokud některá cílová tabulka obsahuje triggery, nastavte return_rows_bulk_insert na False hodnotu (výchozí). Klauzule OUTPUT použitá k vrácení řádků není kompatibilní s tabulkami, které mají INSERT aktivační události.

bulk_update

Slouží bulk_update k aktualizaci více záznamů v jedné databázové operaci:

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

Výchozí parametr

Backend mssql-django stále přijímá parametr default u bulk_update kvůli zpětné kompatibilitě, ale v aktuálních verzích neovlivňuje generované SQL.

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

Backend nyní zpracovává všechny případy aktualizací all-NULL bez nutnosti default.

Note

Ve starších verzích může vynechání default aktivovat SQL Server chybu zobrazenou v předchozím příkladu. Parametr je nadále akceptován pouze proto, aby se nenarušila funkčnost starších míst volání.

Velikost dávky

U velkých datových sad použijte batch_size parametr k omezení počtu řádků na příkaz 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)