Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In diesem Artikel wird erläutert, wie Sie Djangos bulk_create und bulk_update Methoden mit SQL Server über das mssql-django Back-End verwenden.
bulk_create
Wird bulk_create verwendet, um mehrere Datensätze in einen einzelnen Datenbankvorgang einzufügen:
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)
Zeilen aus Bulk Insert zurückgeben
Standardmäßig gibt bulk_create bei Verwendung von SQL Server keine gesetzten Primärschlüsselwerte zurück. Um die Rückgabe von Primärschlüsseln zu aktivieren, setzen Sie return_rows_bulk_insert in Ihrer Datenbank OPTIONS auf 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
Setzen Sie return_rows_bulk_insert auf False (Standardeinstellung), wenn mindestens eine Zieltabelle Trigger hat. Die OUTPUT Klausel, die zum Zurückgeben von Zeilen verwendet wird, ist nicht mit Tabellen kompatibel, die Trigger enthalten INSERT .
Massenaktualisierung
Verwenden Sie bulk_update, um mehrere Datensätze in einem einzigen Datenbankvorgang zu aktualisieren:
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"])
Der Standardparameter
Das mssql-django Backend akzeptiert auf bulk_update weiterhin einen default-Parameter zur Abwärtskompatibilität, hat jedoch in aktuellen Versionen keine Auswirkungen auf das generierte SQL.
At least one of the result expressions in a CASE specification must be an expression other than the NULL constant.
Das Backend verarbeitet jetzt alle Fälle von Aktualisierungen mit all-NULL, ohne dass default erforderlich ist.
Note
In älteren Versionen kann das Weglassen default den im vorherigen Beispiel gezeigten SQL Server Fehler auslösen. Der Parameter wird nur weiterhin akzeptiert, um ältere Aufrufstellen nicht zu beeinträchtigen.
Batchgröße
Verwenden Sie für große Datasets den batch_size Parameter, um die Anzahl der Zeilen pro SQL-Anweisung einzuschränken:
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)