Day 6

echoeunhee·2022년 6월 9일
0

django-orm

목록 보기
6/6

2. django orm 에서도 TRUNCATE를 할 수 있을까?

할수는 있다.

truncate 메소드를 정의해 TRUNCATE TABLE 구문을 실행시키면 된다.

truncate는 테이블을 DROP AND CREATE 한다.

class Category(models.Model):
    @classmethod
    def truncate(cls):
        with connection.cursor() as cursor:
            cursor.execute('TRUNCATE TABLE "{0}" CASCADE'.format(cls._meta.db_table))

3. 시그널과 save는 뭐가 다를까

4. datetime

파이썬에서 내가 겪었던 datetime 고난들

pytz.timezone("Asia/Seoul") 은 +9시간이 아니다

Asia/Seoul의 초기 시차는 UTC+8:28으로 tz database에 기록되어 있다.
pytz는 이 데이터베이스를 기반으로 시차를 적용하는데, datetime.replace()나 datetime.astimezone()을 호출 할 때 가장 오래된 기록을 기준으로 변환을 시도한다. (왜 그러는 걸 까 ..)

따라서 올바른 시간을 얻으려면 아래 방법을 이용해야 한다.

  1. localize()
KST = pytz.timezone("Asia/Seoul")
KST.localize(datetime.now())
  1. localtime()
now = timezone.localtime()

5. 쿼리셋 정렬하기

django orm에서는 order_by 구문이 없으면 알아서 ORDER BY NULL 구문을 추가해준다.

ORDER BY NULL을 왜 넣어주지? 🤔

mysql은 GROUP BY 를 하면 기본적으로 정렬도 함께 수행한다.
아래 사진의 Using filesort

인덱스가 걸려있는 컬럼으로 group by 할 때는 성능에 큰 문제가 되지 않는다.
다만, 인덱스가 없는 컬럼으로 group by 할 경우에는 정렬할 필요가 없어도 정렬을 수행한다.

1) 쿼리 결과를 정렬할 필요가 없고
2) 인덱스가 없는 컬럼으로 group by 를 할때는

ORDER BY NULL 을 추가해주는 것이 성능에 도움을 준다.

profile
리버풀이 리그 우승한다

0개의 댓글