Python&Django Query Debugger 와 Logging

pm1100tm·2020년 12월 20일
2

Python&Django

목록 보기
4/4
post-thumbnail

Python&Django 개발을 할 때, Django ORM 에서 변환해주는 Query 의 갯수, 그리고 걸린 시간을 체크하기에 유용한 데코레이터 코드이다.

import time
import functools
from django.db import connection, reset_queries

def query_debugger(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        reset_queries()
        number_of_start_queries = len(connection.queries)
        start  = time.perf_counter()
        result = func(*args, **kwargs)
        end    = time.perf_counter()
        number_of_end_queries = len(connection.queries)
        print(f"-------------------------------------------------------------------")
        print(f"Function : {func.__name__}")
        print(f"Number of Queries : {number_of_end_queries-number_of_start_queries}")
        print(f"Finished in : {(end - start):.2f}s")
        print(f"-------------------------------------------------------------------")
        return result
    return wrapper

Django ORM 을 통해서 Query가 어떻게 만들어지는지 확인하려면 아래의 코드를 setting.py 에 붙여주면 된다. ORM 을 이용하다 보면 의도와는 다른 Query 가 생성될 수 있다.

LOGGING = {
    'version': 1,
    'filters': {
        'require_debug_true': {
            '()': 'django.utils.log.RequireDebugTrue',
        }
    },
    'handlers': {
        'console': {
            'level': 'DEBUG',
            'filters': ['require_debug_true'],
            'class': 'logging.StreamHandler',
        }
    },
    'loggers': {
        'django.db.backends': {
            'level': 'DEBUG',
            'handlers': ['console'],
        }
    }
}

이제 ORM 에서 만드는 쿼리와, 쿼리 갯수 및 시간을 디버깅하여 코드 품질을 개선시켜볼 수 있는 환경이 세팅되었다..!

profile
개발을 취미로 할 수 있는 그 때 까지

0개의 댓글