디지털 노마드/ 자연인/ IT개발

개발자

[django] update를 Raw SQL Query하는 방법

포하 2021. 7. 23. 11:59

2 일 지난 포스트에 대하여 active = 0를 해주는 쿼리를 HeidiSQL에서 테스트 하고, 이를 장고에서 직접 실행하는 코드입니다.

from django.db import connection


    with connection.cursor() as cursor:
        query = "UPDATE posts SET active = 0 WHERE date < (NOW() - INTERVAL 2 DAY)"
        cursor.execute(query)
        row = cursor.fetchone()    
    logger.warning('>>>>>>>>>> 2일 지난 포스트 remove 완료: {}'.format(row))

실행 후에 결과값을 받아와서 확인할 수 있습니다.

 

2021.07.22 - [개발자] - [django] 중복 제거, group by, raw SQL query로 하는 방법

 

지난 포스트에서 select와 다른점은 fetchall()함수, fetchone()함수의 차이입니다.

 

select결과는 복수이고, update같은 질의는 영향받은 행의 갯수인 단수로 생각하면 이해하기기 편합니다.

 

그리고, 코드 실행 순서는, Excute하여 DB에서 실행하고, Fetch하여 결과를 가져오는 순서입니다.

 

부끄럽지만 장고 쿼리셋 만개를 update한적이 있습니다.

    queryset = Posts.objects.filter(id__in=ids_list)
    for posts in queryset:
        posts.active = '0'
        posts.save()

위 코드로 10분 가량 소요 됩니다.

 

이런 증상은 api호출 timeout이나 또는 DB Lock timeout등 여러가지 불안정한 시스템을 야기 시킵니다. 장고 쿼리셋은 사용하기 편하지만 느립니다. 그래서 Raw SQL Query를 사용합니다.

 

더 자세한 내용은 장고 오피셜 문서를 참고바랍니다.

 

https://docs.djangoproject.com/en/3.2/topics/db/sql/

 

Performing raw SQL queries | Django documentation | Django

Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About ♥ Donate

docs.djangoproject.com