Yang 코딩 공부

Django 한번에 대량 업데이트 본문

Django/tip

Django 한번에 대량 업데이트

코딩하는 Yang 2022. 7. 4. 12:49
  1. Django의 bulk_update() 메서드
  2. bulk_update()메서드의 단점

model.objects.bulk_update(obj, fields, batch_size)

  • objs - 수행 할 작업 목록
  • fields - 쿼리를 수행 할 필드 목록
  • batch_size - 단일 데이터베이스 쿼리에 저장할 개체 수, 선택적 인수

ex)
이름과 나이를 저장하는 Person 모델이 있다고 해보자

from django. db import models

class Person(models.Model):
    username = models.CharField(max_length = 100, unigue = True)
    ...
    age = models.IntrgerField(default = 0)

그뒤 해당 Person모델로 저장된 모든 사람의 나이를 1만큼 씩 증가시킨다고 하면

people = Person.objects.all()

for person in people:
    person.age += 1
    person.save()

위 코드와 같이 수행했을 것이다.
하지만 해당 코는 쿼리셋 개체의 수만큼 쿼리가 발생하기 때문에 비효율적이다.

people = Person.objects.all()

for person in people:
    person.age += 1
Person.objects.bulk_update(people, fields = ['age'])

해당 코드처럼 bulk_update를 사용하게 되면 단일 쿼리로 한번에 업데이트 할 수 있다.

bulk_update()메소드의 단점

  • bulk_update()메스드를 사용할 경우 기본키(primary key) 값은 변경할 수 없다.
  • 모든 모델에는 save()메서드가 존재하는데, 이 메서드는 bulk_update() 메서드를 사용할 때는 호출되지 않습니다. 즉슨 모델에서 save()메서드를 오버라이딩 하더라도 적욛되지 않습니다.
  • 많은 레코드에 대해 열을 업데이트하는 경우 배치 크기(batch_size) 값을 작성해줘야 합니다. 그렇지 않으면 생성된 SQL 쿼리가 매우 길어진다고 합니다.