이 문서에서는 mssql-django 백엔드를 통해 SQL Server에서 Django의 bulk_create 및 bulk_update 메서드를 사용하는 방법을 설명합니다.
bulk_create
단일 데이터베이스 작업에 여러 레코드를 삽입하는 데 사용합니다 bulk_create .
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)
대량 삽입에서 행 반환
기본적으로 bulk_create SQL Server 사용할 때 채워진 기본 키를 반환하지 않습니다. 기본 키 반환을 사용하도록 설정하려면 데이터베이스 OPTIONS에서 return_rows_bulk_insert를 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
대상 테이블 중 하나라도 트리거가 있으면 return_rows_bulk_insert을(를) False(기본값)로 설정합니다. 행을 반환하는 데 사용되는 절은 OUTPUT 트리거가 있는 INSERT 테이블과 호환되지 않습니다.
일괄 업데이트
단일 데이터베이스 작업에서 여러 레코드를 업데이트하는 데 사용합니다 bulk_update .
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"])
기본 매개 변수
백엔드는 이전 버전과의 호환성을 위해 bulk_update에서 여전히 default 매개 변수를 허용하지만, 현재 릴리스에서는 이것이 생성되는 SQL에 영향을 주지 않습니다.
At least one of the result expressions in a CASE specification must be an expression other than the NULL constant.
이제 백엔드는 모든-NULL 업데이트 경우를 default 없이 처리합니다.
Note
이전 버전에서는 생략하면 default 이전 예제에 표시된 SQL Server 오류가 트리거됩니다. 매개 변수는 이전 호출 사이트를 중단하지 않도록 허용된 상태로 유지됩니다.
묶음 크기
큰 데이터 세트의 경우 매개 변수를 batch_size 사용하여 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)