🔥TIL#8. QuerySet 작업 관련 tip(bulk_create, transaction) 과 예외처리

백승진·2020년 11월 22일
0

wecode Django 실습

목록 보기
10/16

bulk_create

bulk_create는 list를 argument로 받으면 1 Hit로 여러개의 data를 Database에 추가하도록 지원하는 함수이다. 대량의 data를 생성해야 할 경우 Hit 횟수는 성능에 큰 차이를 발생시킨다.
1000개의 User data를 User table에 추가해야 할 때 create를 이용한 방식과 bulk_create를 이용한 방식을 알아보자.

create

user_list = [{id:1, name:'jin', email:'jin@example.com', ...}
			{id:2, name:'hwan', email:'hwan@example.com', ...}]	
           
for user in user_list:
	User.objects.create(id = user.id,
    					name = user.name,
                        email = user.email,
                        ...)

bulk_create

user_list = [{id:1, name:'jin', email:'jin@example.com', ...}
			{id:2, name:'hwan', email:'hwan@example.com', ...}]	
           
bulk_list = []
for user in user_list:
	bulk_list.append(
    		User(id = user.id, name = user.name,
    	         	email = user.email, ...)
    )

User.objects.bulk_create(bulk_list)

성능을 위해 다수의 data를 한번에 넣어야 할 경우 bulk_create를 추천한다. 수량에 따라 처리속도 차가 비례하여 벌어진다.
추가로 위 코드에서 list comprehension을 적용하면 가독성과 성능 측면에서 더 효과를 볼 수 있다.

bulk_create and list comprehension

user_list = [{id:1, name:'jin', email:'jin@example.com', ...}
			{id:2, name:'hwan', email:'hwan@example.com', ...}]	
           
User.objects.bulk_create(
	[
    		User(
            	id = user.id, name = user.name, email = user.email, ...
                ) for user in user_list            	
    	])

transaction

DATABASE session 에서 ACID와 transaction에 대해 배운적이 있다.
Data에 대한 CUD 과정이 일어나는 도중 Network 또는 Hardware 장애로 인해 중간에 실행이 중지될 경우 Data는 CRUD 시도 이전 상태로 유지되어야 한다.
이를 위해 django는 몇가지 기능을 제공하고 있으며 나는 django에서 제공하는 decorator를 사용하였다.

from django.db import transaction

@transaction.atomic
def CURD_function():
	# CUD 관련 처리

위 처럼 django.db의 transaction 모듈을 import, transaction.atomic decorator를 적용할 함수에 반영하면 이 함수에서 발생하는 CUD에 대해 문제 발생시 automic 을 지켜준다

profile
12년 .NET 개발 경력을 가진 웹 초짜 개발자입니다 :)

0개의 댓글