본문 바로가기
Django

Django 다수 업데이트할때 bulk_ 활용하기

by Django_ 2021. 1. 3.
반응형

다수의 데이터를 저장할때,

예를 들어 이렇게 대량의 이미지를 저장한다고 해보겠습니다.

# ex len(data_list) = 100개
for count, data in enumerate(data_list):
   data.img = img[count]
   data.title = title[count]
   data.save()

가장 간단하게 생각해보면 이렇게 하는게 가장 쉬운 것 같습니다.

뭐 단 한번 이렇게 한다면 크게 문제될것은 없을 수 있습니다.

뭐 사용자가 이렇게하는게 아니고 관리지만 쓴다던지 그럴때도 간편하게 한번 짤 수 있을것입니다.

하지만 이때 리스트가 100개라면 쿼리는 100개가 발생 하게 됩니다.

많다면 많고 적다면 적을 수 있습니다.

그렇다면 어떻게 해야 효율적으로 짤수 있을까요??

creat_list = [ ]

# ex len(data_list) = 100개
for count, data in enumerate(data_list):
   new = Model(img=img[count], title=title[count])
   creat_list.append(new)

Model.objects.bulk_create(creat_list)

해당 코드처럼 리스트를 만들고 생성할 객체들을 append한 후 루프를 다 돈 후 1회 bulk_create()를 하게 되면 쿼리 한번에 100개의 데이터를 생성할 수 있는것과 동일합니다! 엄청난 차이가 아닐 수 없습니다! ㅎ 유용하게 사용하세요

배치 사이즈는 무한대로할 수있는것은 아닙니다 보통 테스트를하는 경우 아니고서는 100이상이 넘으실일이 있을까 싶긴하네요 ㅎ

 

업데이트는 이미 기초 과정에서도 많이 알려진것은 해당 코드이죠

Model.objects.filter(img=img).update(title="new title")

하지만 실제로 하다보면 데이터마다 update 내용이 다른 경우가 더 많을 것입니다.

 

예를들어 이미지를 모델에 썸네일로 저장하는것입니다.

하지만 img.size를 하게되면 업로드된 img.size가 표시될것입니다.

아직 save()가 되지 않았기때문에 썸네일로 변환된 img.size를 얻을수 없다고 하겠습니다.

그렇다면 thumbnail_img.size를 다시 저장해야합니다.

# ex len(data_list) = 100개
for count, data in enumerate(data_list):
   data.thumbnail_img = img[count]
   data.title = title[count]
   data.save()
   data.thumbnail_size = data.thumbnail_img.size
   data.save()

만약 리스트가 100개라면 이미지를 저장하는데 100번의 쿼리가 발생하고 썸네일 사이즈를 저장하는데 다시 100번의 쿼리가 발생하여 200번의 쿼리가 발생하게 됩니다.

update_list = [ ]

# ex len(data_list) = 100개
for count, data in enumerate(data_list):
   data.thumbnail_img = img[count]
   data.title = title[count]
   data.save()
   data.thumbnail_size = data.thumbnail_img.size
   creat_list.append(new)

Model.objects.bulk_update(update_list)

해당 코드 처럼 bulk_update를 사용하면 이미지 저장하는데 100번의 쿼리가 발생하여도 썸네일이미지 사이즈 업데이트할때는 1번의 쿼리로 100개의 썸네일 이미지를 업데이트 할 수 있게 됩니다!

쿼리하는것은 시간이 많이 소요되는 비용이 비싼 작업이니 쿼리를 최대한 적게하는게 사용자 경험을 개선시키는것 같습니다!

 

반응형

댓글