
안녕하세요.
오늘은 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'])
감사합니다.
'Web > Django' 카테고리의 다른 글
| Django Celery, Rabbitmq 사용한 비동기 작업 처리 (0) | 2024.08.14 |
|---|---|
| Django rest_framework filters 삽질 일기 (0) | 2023.08.19 |
| Django SSH tunneling(AWS SSH) , AWS RDS, inspectDB (0) | 2022.07.12 |
| [Django] GraphQL 기초 한 방 정리 (0) | 2020.12.12 |
| [Django Rest Framework] ModelViewset 동작에 대해 (queryset, get_object) (1) | 2020.08.20 |
댓글