장고 개발을 하면서 여러 객체에 대한 데이터 베이스 업데이트를 진행해야 할 일이 있었다. 기존에는 for문을 이용하여 처리하였는데 대량의 데이터 처리를 효율적으로 처리할 수 있는 기능인 Bulk 연산에 대해서 알게 되었다.
Bulk Operations 이란?
Bulk 연산은 여러 개의 데이터 베이스 레코드를 한 번에 삽입, 업데이트, 삭제하는 작업을 의미한다. 이 기능을 사용하면 각각의 레코드에 대해 별도의 쿼리를 실행하는 것보다 훨씬 효율적으로 데이터를 처리하고 쿼리 성능을 높일 수 있다.
기존에 for문을 이용하여 처리할 경우 개별적인 쿼리가 실행되는 반면 bulk는 적은 수의 쿼리로 실행이 되어 데이터 베이스 성능을 향상할 수 있고, 코드를 간결하게 유지할 수 있다는 장점이 있었다.
반대로, 하나의 쿼리로 많은 객체를 메모리에 로드하므로 메모리 사용량에 주의해야 하며, 삽입 연산인 bulk_create의 경우는 생성된 객체들을 반환하지 않음으로, 필요한 경우 다시 조회해야 할 수 도 있다.
Django에서의 Bulk Operations
앞서 이야기했듯, Bulk는 아래와 같은 주요 연산을 제공한다
- bulk_create()
- bulk_update()
- bulk_delete()
bulk_create()
여러 개의 객체를 한 번에 데이터베이스에 삽입해야하는 경우 사용된다. 예를 들어 수백개의 새 사용자 계정을 한번에 생성해야하는 경우 유용하다.
모든 객체를 하나의 쿼리로 해결하기 때문에 성능이 크게 향상된다.
from myapp.models import MyModel
objects = [
MyModel(field1='value1', field2='value2'),
MyModel(field1='value3', field2='value4'),
# 여러 객체 추가
]
MyModel.objects.bulk_create(objects)
bulk_update()
여러 객체를 한번에 업데이트하는 데 사용된다. 변경할 필드 목록을 인자로 받아 사용된다.
from myapp.models import MyModel
objects = MyModel.objects.filter(some_condition=True)
for obj in objects:
obj.field_to_update = 'new_value'
MyModel.objects.bulk_update(objects, ['field_to_update'])
bulk_delete()
bulk_delete를 이용하여 제거할 수 있으나, queryset의 delete메서드를 이용하여 대량 삭제할 수 있기 때문에 굳이 사용하지 않고 DELETE 쿼리를 사용하여 처리할 수 있다.
from myapp.models import MyModel
MyModel.objects.filter(some_condition=True).delete()
'BackEnd > Django, DRF' 카테고리의 다른 글
[Django] admin.ModelAdmin 메서드 정리 (0) | 2024.07.03 |
---|---|
[Django] Model Meta 설정 Permission을 이용한 사용자 접근 제한 (0) | 2024.07.03 |
[Django] 모델 기본 필드 이해하기 (1) | 2024.06.18 |
[Django] Generic date views (Archive views) (0) | 2024.06.18 |
[Django] django_extensions (0) | 2024.06.17 |