Django ORM replace 'for' vs 'bulk_update'
Web/Django

Django ORM replace 'for' vs 'bulk_update'

뉴비뉴 2022. 9. 30.


안녕하세요.

오늘은 for vs bulk_update 에 대해서 이야기 해 보겠습니다.
현재 데이터베이스의 수 많은(10만개) 데이터를 값을 변경해야되는 상황입니다.
데이터가 많기 때문에 신중해야 되는데요!

현재 exclude 와 filter를 이용하여 변경해야 되는 데이터는 뽑아둔 상태입니다.

file_name = [미국, 한국, 북한]

objects.exclude(
	file_name__contains='북한'
    ).filter(
    	file_name__contains='한국'
    )
    
--
# I don't recommend it

for obj in objs:
    obj.file_name='로또당첨'
    obj.save()

결과부터 말하자면 당연히 for 문의 패배입니다.
왜냐하면 for는 쿼리를 하나씩 돌리기 때문이죠.

그럼 한 가지 의문점이 생깁니다. '쿼리셋 캐싱해서 for문 도는 것도 안좋은 방법인가?'
정답은 어찌됐는 loop 안에서 update ORM 을 사용하면 반복하는 만큼 커넥션이 발생합니다.
bulk_update 한번의 커넥션만 발생하구요.

그렇다면 만약 bulk의 갯 수도 많으면?
1,000만 개의 데이터를 돌려야 된다면?!
그럴 땐 청크(chunks) 사이즈를 정해서 적절히 분할해주면 됩니다.

file_name_list = []

objs = data_1000000.objects.exclude(
	file_name__contains='북한'
    ).filter(
    	file_name__contains='한국'
    )
    
for obj in objs:
    obj.audio_file = obj.file_name.replace('한국', '로또당첨')
    file_name_list.append(obj)
    
objects.bulk_update(file_name_list, ['file_name'])


감사합니다.

댓글

💲 추천 글