본문 바로가기
Django

bulk_create가 id 값을 리턴해 주지 않는다면~?

by Django_ 2021. 7. 24.
반응형

한번에 대량의 데이터를 저장하거나 업데이트를 해야하는 경우가 많이 있습니다.

그럴때 쉽게 생각해볼 수 있는 방법이 아래와 같은 방법일것입니다

# 아래와 같이 하면 엄청난 성능 저하를 맛 볼 수 있게 됩니다 

for data in data_list:
   models.CartDesign.objects.create(
      user=self.request.user, order_product=product.id,
      order_info_id=order_info.id, uuid=data.uuid))

하지만 엄청난 성능 저하를 경험하게됩니다.

for문을 돌면서 N번 만큼 SQL에 쿼리를 날리기 때문입니다.

중간에 롤백이라도 하게 된다면 정말 비효율적이겠죠?

데이터가 적은 수라면 상관 없겠지만 데이터도 많고 사용자도 많다면 엄청난 불편함을 겪게 될것입니다.

사용자 역시 엄청난 대기시간을 기다려야할것입니다.

 

그때 사용해야하는것이 바로 bulk_create 입니다.

간편하게 bulk_create 를 사용하여 만든 모델을 다른 모델이 외래키로 참조해야하는 경우가 있었습니다.

그래서 bulk_create 생성한 데이터를 참조하려고 했습니다.

 

bulk_list = []

for data in data_list:
	bulk_list.append(models.CartDesign(
                     user=self.request.user, order_product=product.id,
                     order_info_id=order_info.id, uuid=uuid))
                     
new_data = design_models.CartDesign.objects.bulk_create(bulk_list)

print(new_data[0].id)

### None

그런데 분명히 데이터베이스에도 생성된것이 확인 되었지만, id값을 조회하면 None을 내 뿜는것을 확인했습니다.

이럴때는 우선 구글링..ㅠㅠ

구글링 하던 중 원인을 찾게되어 django 공식 doc 문서를 확인해보았습니다

 

- 모델의 save() 메서드는 pre_save 및 post_save 에게 신호를 전달하지 않습니다.

- 상속 모델에서 자식모델에서는 동작하지 않는다.

- 오토 필드의 경우 PostgreSQL만 지원이 됩니다.

- 다대다 관계는 동작하지 않습니다.

정도 가볍게  신경써야 하는 부분인데요 

 

저는 db를  mysql로 사용하고있어서 오토필드에 대한 return을 받지 못하는 것이였습니다.

이래서 django와 PostgreSQL가 핏이 좋다고하는것같습니다.

이전에는 JsonField를 PostgreSQL에서만 사용했지만 현재는 모든 DB에서 사용할 수 있게 된것처럼 해당 기능도 모든 DB에서 가능하게 되겠지만 현재는 이러한 것들이 쌓여 pythonic한 코드를 짜는데 제한이 되는것 같습니다.

(이게 아니더라도 pythonic한 코드를 짜고있는건 아니지만....)

 

데이터 마이그레이션이란 어마어마한 산을 넘어 PostgreSQL로 이전할지 고민을 해봐야겠습니다.

 

반응형

댓글