6.Django SQL 디버깅
django-debug-toolbar를 통한 SQL 디버깅
request/response(HTML에서만 가능 API는 불가)에 대한 다양한 디버깅 정보를 보여줌
- 다양한 Panel 지원
- SQLPanel을 통해, 각 요청 처리 시에 발생한 SQL 내역 확인 가능
- Ajax 요청에 대한 지원은 불가
- 웹페이지 템플릿(html)에 ‘<body>’ 태그가 있어야만, django-debug-toolbar가 작동함(미들웨어를 통해)
dbt의 html/script 디폴트 주입 타겟이 ‘</body>’ 태그 (INSERT_BEFORE 설정)
설정 순서
- 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',
# ...
]
- 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',
]
댓글남기기