반응형
Django ORM
Django의 ORM은 SQL문을 사용하지 않고도 아주 손쉽게 조회, 생성, 수정, 삭제 할 수 있다.
Save( ) Method
작동 방법
오늘 정리해 볼 주제는 바로 우리가 자주 사용하는 save() method이다.
값을 수정할 때 자주 쓰는 method인데 어떻게 작동하는지 최근에야 알게 되었다.
save() method는 호출 할 때 해당 테이블의 모든 열이 업데이트 된다.
설명글 보다는 코드로 직접 예시를 들어 설명하는 것이 이해에 도움이 될 것같아 아래 코드를 첨부했다.
예를 들어 아래와 같은 User Table이 있다고 해보자.
from django.db import models
class User(models.Model):
name = models.CharField(max_length=255, verbose_name='이름')
email = models.EmailField(max_length=255, unique=True, verbose_name='이메일')
is_admin = models.BooleanField(default=False, verbose_name='관리자 여부')
ID가 1인 사용자의 이름을 변경하려고 한다면 아래와 같이 코드를 작성할 수 있다.
>>> user = User.objects.get(id=1)
>>> user.name = "홍길동"
>>> user.save()
위의 코드를 실행했을 때 실제 DB의 Query는 다음과 같다.
UPDATE "user"
SET "name" = '홍길동',
"email" = 'example@email.com',
"is_admin" = FALSE
WHERE "id" = 1
수정하고자 한 컬럼은 이름 하나 뿐이었는데, 테이블에 존재하는 모든 컬럼이 불러와져 업데이트 된다.
이게 뭐가? 할 수도 있지만 만약 30개가 넘는 컬럼으로 구성되어있는 테이블에 대해 위와 같이 작성한 save() method를 여러번 반복해서 실행 시킨다면 어떤가? 불필요한 Query 실행으로 오버헤드가 발생 할 것이다.
오버헤드란?
Time spent doing "not-useful" work.
오버헤드란 프로그램의 실행 흐름에서 나타나는 현상 중 하나로 예를 들어, 프로그램의 실행 흐름 도중에 동떨어진 위치의 코드를 실행시켜야 할 때, 추가적으로 시간/메모리/자원이 사용되는 현상입니다.
한마디로 정의하자면, 오버헤드는 특정 기능을 수행하는데 드는 간접적인 시간, 메모리 등의 자원을 말한다.
효율적인 사용법
이를 해결하기 위한 방법은 아주 간단하다.
save() method에 update_fields 인자 값을 아래와 같이 넣어 사용해주면 된다.
>>> user = User.objects.get(id=1)
>>> user.name = "홍길동"
>>> user.save(update_fields=['name'])
update_fields를 사용했을 때 실행되는 Query는 아래와 같다.
UPDATE "user"
SET "name" = '홍길동',
WHERE "user"."id" = 1
사용하지 않을 이유가 전혀 없는 꿀팁이다 \\ ^ ^ //
반응형