6.Django SQL 디버깅

1 분 소요

django-debug-toolbar를 통한 SQL 디버깅

request/response(HTML에서만 가능 API는 불가)에 대한 다양한 디버깅 정보를 보여줌

  • 다양한 Panel 지원
    • SQLPanel을 통해, 각 요청 처리 시에 발생한 SQL 내역 확인 가능
    • Ajax 요청에 대한 지원은 불가
  • 웹페이지 템플릿(html)에 ‘<body>’ 태그가 있어야만, django-debug-toolbar가 작동함(미들웨어를 통해)

    dbt의 html/script 디폴트 주입 타겟이 ‘</body>’ 태그 (INSERT_BEFORE 설정)

툴바

설정 순서

  1. settings.py
# settings.py
INSTALLED_APPS = [
    # ...
    'django.contrib.staticfiles',
    # ...
    'debug_toolbar',
]

STATIC_URL = '/static/'

# ...

# 미들웨어에서 디버깅 정보 삽입
MIDDLEWARE = [
    # ...
    'debug_toolbar.middleware.DebugToolbarMiddleware',
    # ...
]

# ...

# 디버그 툴바에 접근 가능한 IP 설정 민감한 정보가 많기 때문에 꼭 설정
INTERNAL_IPS = [
    # ...
    '127.0.0.1',
    # ...
]
  1. urls.py에 추가
# urls.py
import debug_toolbar
from django.conf import settings
from django.urls import include, path

urlpatterns = [
    ...
    path('__debug__/', include(debug_toolbar.urls)),
]

코드를 통한 SQL 내역 확인

  • QuerySet의 query 속성 참조

    ex) print(Post.objects.all().query) -> 실제 문자열 참조 시에 SQL 생성

  • settings.DEBUG = True 시에만 쿼리 실행내역을 메모리에 누적

    서버 재시작시 자동 메모리 클리어 (실서비스에서 서버 재시작을 하지않으므로 메모리 부족이 발생할 수 있음) django.db.reset_queries()를 통해 수동 초기화 가능

from django.db import connection, connections

for row_dict in connection.queries:
    print('{time} {sql}'.format(**row_dict))
connections['default'].queries

django-querycount

  • SQL 실행 내역을 콘솔에 출력
  • AJAX 내역도 출력

  • settings.py/MIDDLEWARE 추가
settings.py
MIDDLEWARE = [
    'querycount.middleware.QueryCountMiddleware',
]

댓글남기기