Bulkbewerkingen met mssql-django

In dit artikel wordt uitgelegd hoe u Django's bulk_create en bulk_update methoden gebruikt met SQL Server via de mssql-django back-end.

meerdere items aanmaken

Gebruik bulk_create dit om meerdere records in te voegen in één databasebewerking:

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)

Rijen retourneren uit een bulkinvoeging

bulk_create Standaard worden niet ingevulde primaire sleutels geretourneerd bij het gebruik van SQL Server. Als u het retourneren van primaire sleutels wilt inschakelen, stelt u return_rows_bulk_insert in uw database OPTIONS in op True:

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

Ingesteld return_rows_bulk_insert op False (de standaardinstelling) als een doeltabel triggers heeft. De OUTPUT component die wordt gebruikt om rijen te retourneren, is niet compatibel met tabellen met INSERT triggers.

bulksgewijs bijwerken

Gebruik bulk_update dit om meerdere records bij te werken in één databasebewerking:

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

De standaardparameter

De mssql-django backend accepteert nog steeds een default-parameter op bulk_update voor achterwaartse compatibiliteit, maar die heeft geen invloed op de gegenereerde SQL in de huidige releases.

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

De backend verwerkt nu alle all-NULL-updategevallen zonder dat default vereist is.

Note

In oudere versies kan weglaten default de SQL Server fout activeren die in het vorige voorbeeld wordt weergegeven. De parameter blijft alleen geaccepteerd om te voorkomen dat oudere oproepsites worden onderbroken.

Batchgrootte

Voor grote gegevenssets gebruikt u de batch_size parameter om het aantal rijen per SQL-instructie te beperken:

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)