Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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)