20191130 TIL - Django ORM : bulk_update

박경연 (돌진어흥이)·2019년 11월 30일
2

오늘은 에어비엔비 데이터중에 내가 임의로 지정해주어야 하는 데이터를 만지다가 쓰게된 django ORM중 하나인 bulk_update를 정리하고자 포스팅을 한다.

1. 필요성

이전에 포스팅 했던 bulk_create는 말그대로 CRUD중에 Create의 영역을 담당한다. 한줄 한줄씩 생성하는 것이 아니고, 내가 집어넣고자 하는 데이터의 인스턴스를 리스트로 만들어 놓은 후, 여러줄로 주르르르르륵 집어넣는것이 bulk_create였다.
bulk_update도 별반 다르지 않다. 여러줄을 업데이트 해야할 때, 한줄 바꾸고 save()를 하는 방식이 아니고, 여러 인스턴스를 불러온 후에 내가 원하는 필드 값만 바꿔놓고 디비에 딱 한번만 접근해서 업데이트시킨다.다만 코드상에서 사용하게될때 쿼리셋의 리스트를 불러놓고 사용한다는게 좀 다를려나...

2. 실제 사용

이번에 airbnb클론 코딩 프로젝트의 디비를 날려먹는 바람에 나는 크롤링을 다시해야 했다. 그리고 내가 지역별 숙소 추천을 위해 임의로 지정해놓은 city_id는 크롤러가 따로 부여해주지 않기 때문에, 내가 하나씩 update를 해줘야했다. 그 중에 bulk_create를 사용했던 기억중에 bulk_update도 장고 Document에서 본 기억이 있어 실제로 사용하게 되었다.

쉘을 켜고 우선 모델을 임포트한다.

from rooms.models import Rooms

이후 숙소 인스턴스들 중 내가 city_id를 지정해주어야 하는 숙소들만 불러온다. 크롤러가 기본을 1로 지정해주었기 때문에 city_id가 1인 숙소들 중 첫 30개 이후의 30개를 불러왔다

a = Rooms.objects.filter(city_id)[30:60]

a를 입력하여 숙소 인스턴스들이 제대로 불러졌는지 확인을 해준 후에 이제 city_id의 값을 바꿔준다.

for room in a : 
	room.city_id = 2

이제 bulk_update로 저장해주면 된다.

Rooms.objects.bulk_update(a, ['city_id'])

첫번째 변수는 영향을 받을 쿼리셋, 두번째 변수는 영향 받는 컬럼(필드명)이다.

생각보다 별거 없어보일 수도 있지만, 이 메소드는 update()보다 훨씬 효율적으로 움직인다. 왜냐하면 update() 또한 n개의 데이터가 수정된다면, 인스턴스 각각 한개씩, 결국 데이터베이스에 row하나 하나에 각각 접근하지만, bulk_update는 이를 한번에 접근하여 저장하기 때문에 대용량의 데이터를 처리할 경우 상당한 시간절약이 될 수 있을것으로 보인다.

profile
Back-end Developer, pursuing to be a steadily improving person.

0개의 댓글