Python/Django

[Django] Query Profiling Tool (2) - Custom Decorator & Logger

yubi5050 2022. 8. 12. 09:35

Query Debugger

Custom Decorator 형식의 Query Debugger로 전체 API 동작간 호출 된 Query의  갯수, 전체 걸린 시간을 체크할 수 있다.

(ex. Testcode에서 함수 위에 설정해서 실행해도 동작한다) 

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

def query_debugger(func):
    @functools.wraps(func)
    def inner_func(*args, **kwargs):
        reset_queries()

        start_queries = len(connection.queries)

        start = time.perf_counter()
        result = func(*args, **kwargs)
        end = time.perf_counter()
        
        end_queries = len(connection.queries)
        print(f"------------------------------------------------------")
        print(f"Function : {func.__name__}")
        print(f"Number of Queries : {end_queries - start_queries}")
        for idx, query in enumerate(connection.queries):
            print(f"{idx+1}번째: {query.get('sql')}")
        print(f"Finished in : {(end - start):.6f}s")
        print(f"------------------------------------------------------")
        return result

    return inner_func

 

 

Logger

실제 어떤 Query문이 얼마의 시간동안 실행되는지 낱개로 확인할 때 유용

# https://docs.djangoproject.com/en/1.11/topics/logging/
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
        }
    },
    'loggers': {
        'django.db.backends': {
            'handlers': ['console'],
            'level': 'DEBUG',
        },
    }
}