mssql-django를 사용하여 대량 작업

이 문서에서는 mssql-django 백엔드를 통해 SQL Server에서 Django의 bulk_createbulk_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_insertTrue로 설정하세요:

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)