ORM 을 제대로 쓰려면 실제 쿼리(속칭 ‘날쿼리’) 가 어떻게 생성되는지 봐야한다.
django orm 이 실행하는 sql 문을 단순히 보여줄 뿐만 아니라 예쁘게 포맷팅해서 콘솔에 찍어보자.
1.
settings.py 에 import 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
복사
색깔과 포맷팅까지 적용이 돼서 훨씬 보기 좋다