Search

[django,drf] django ORM 이 실행하는 sql 문 포맷팅해서 출력하기

타입
개발
태그
django
drf
상태
Published
생성일
2023/02/22 07:56
최종 편집 일시
2023/07/18 01:46
2 more properties
ORM 을 제대로 쓰려면 실제 쿼리(속칭 ‘날쿼리’) 가 어떻게 생성되는지 봐야한다.
django orm 이 실행하는 sql 문을 단순히 보여줄 뿐만 아니라 예쁘게 포맷팅해서 콘솔에 찍어보자.
1.
settings.pyimport logging 추가
import logging from pathlib import Path # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent ...
Python
복사
2.
비교체험(?)을 위해서 우선은 포맷팅과 색깔을 적용하지 않은 채로 sql 쿼리로그를 보여주게끔 세팅해보자.
포맷팅을 실제로 해주는 부분에 주석처리를 해놨다
settings.py 에 추가
# SQL 로깅 커스텀 포맷터 class SQLFormatter(logging.Formatter): def format(self, record): # Check if Pygments is available for coloring try: import pygments from pygments.formatters import TerminalTrueColorFormatter from pygments.lexers import SqlLexer except ImportError: pygments = None # Check if sqlparse is available for indentation try: import sqlparse except ImportError: sqlparse = None # Remove leading and trailing whitespaces sql = record.sql.strip() # type: ignore if sqlparse: # Indent the SQL query sql = sqlparse.format(sql, reindent=True) if pygments: # Highlight the SQL query sql = pygments.highlight( sql, SqlLexer(), # type: ignore # TerminalTrueColorFormatter(style='monokai') TerminalTrueColorFormatter(), # type: ignore ) # Set the records statement to the formatted query record.statement = sql return super(SQLFormatter, self).format(record) LOGGING = { "version": 1, "disable_existing_loggers": False, "filters": { "require_debug_true": { "()": "django.utils.log.RequireDebugTrue", }, "require_debug_false": { "()": "django.utils.log.RequireDebugFalse", }, }, "formatters": { "django_server_formatter": { "()": "django.utils.log.ServerFormatter", "format": "[{asctime}] {message}", "datefmt": "%Y-%m-%d %H:%M:%S", "style": "{", }, "standard_formatter": { "format": "[%(asctime)s] [%(levelname)s] %(name)s: %(message)s", "datefmt": "%Y-%m-%d %H:%M:%S", }, # "sql_formatter": { # "()": SQLFormatter, # "format": "\n[%(asctime)s] [%(duration).3f] \n %(statement)s", # "datefmt": "%Y-%m-%d %H:%M:%S", # }, }, "handlers": { "django_server_handler": { "level": "DEBUG", "class": "logging.StreamHandler", "formatter": "standard_formatter", }, "sql_handler": { "level": "DEBUG", "class": "logging.StreamHandler", # "formatter": "sql_formatter", }, }, "loggers": { "django.db.backends": { "handlers": ["sql_handler"], "level": "DEBUG", }, "django.server": { "handlers": ["django_server_handler"], "level": "DEBUG", "propagate": False, }, }, }
Python
복사
sql 쿼리 로그가 뜨긴 하지만 포맷팅이 안 돼서 알아보기 어렵다
3.
이제 포맷팅을 적용해보자
4.
커스텀 SQL 포맷터에서 사용하는 패키지인 pygments 설치
pip install pygments
5.
LOGGING 에서 주석 해제
LOGGING = { "version": 1, "disable_existing_loggers": False, "filters": { "require_debug_true": { "()": "django.utils.log.RequireDebugTrue", }, "require_debug_false": { "()": "django.utils.log.RequireDebugFalse", }, }, "formatters": { "django_server_formatter": { "()": "django.utils.log.ServerFormatter", "format": "[{asctime}] {message}", "datefmt": "%Y-%m-%d %H:%M:%S", "style": "{", }, "standard_formatter": { "format": "[%(asctime)s] [%(levelname)s] %(name)s: %(message)s", "datefmt": "%Y-%m-%d %H:%M:%S", }, "sql_formatter": { "()": SQLFormatter, "format": "\n[%(asctime)s] [%(duration).3f] \n %(statement)s", "datefmt": "%Y-%m-%d %H:%M:%S", }, }, "handlers": { "django_server_handler": { "level": "DEBUG", "class": "logging.StreamHandler", "formatter": "standard_formatter", }, "sql_handler": { "level": "DEBUG", "class": "logging.StreamHandler", "formatter": "sql_formatter", }, }, "loggers": { "django.db.backends": { "handlers": ["sql_handler"], "level": "DEBUG", }, "django.server": { "handlers": ["django_server_handler"], "level": "DEBUG", "propagate": False, }, }, }
Python
복사
색깔과 포맷팅까지 적용이 돼서 훨씬 보기 좋다