Tömeges műveletek az mssql-django használatával

Ez a cikk bemutatja, hogyan használhatók a Django bulk_create és bulk_update metódusai az SQL Serverrel a mssql-django háttérrendszeren keresztül.

tömeges létrehozás

Több bulk_create rekord beszúrása egyetlen adatbázisműveletbe:

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)

Sorok visszaadása tömeges beszúrásból

Alapértelmezés szerint bulk_create nem ad vissza kitöltött elsődleges kulcsokat SQL Server használatakor. Az elsődleges kulcsok visszaadásának engedélyezéséhez állítsa return_rows_bulk_insertTrue be az adatbázisban 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

return_rows_bulk_insert Ha bármelyik céltábla eseményindítókkal rendelkezik, állítsa False (az alapértelmezett) értékre. A OUTPUT sorok visszaadására használt záradék nem kompatibilis az eseményindítókkal rendelkező INSERT táblákkal.

bulk_update

Több rekord frissítésére használható bulk_update egyetlen adatbázisműveletben:

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

Az alapértelmezett paraméter

A mssql-django háttérrendszer továbbra is elfogad egy paramétert default a bulk_update visszamenőleges kompatibilitás érdekében, de ez nem befolyásolja a jelenlegi kiadásokban létrehozott SQL-t.

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

A backend mostantól az összesNULL frissítési esetet kezeli anélkül, hogy default szükséges lenne.

Note

A régebbi verziókban a kihagyás default kiválthatja az előző példában látható SQL Server hibát. A paraméter csak a régebbi híváswebhelyek feltörésének elkerülése érdekében lesz elfogadva.

Köteg mérete

Nagy adathalmazok esetén a batch_size paraméter használatával korlátozhatja az SQL-utasításonkénti sorok számát:

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)