如何记录我的django应用程序执行的所有SQL查询?
我想记录所有内容,包括来自管理站点的SQL。我看到this question和a FAQ answer,但我仍然无法弄清楚应该放在哪里
from django.db import connection
connection.queries
将所有内容记录到一个文件中?
所以我的问题是 - 我应该怎么做一个文件(比如all-sql.log)来记录所有SQL语句?
答案 0 :(得分:124)
将以下代码段与LOGGING
中的settings.py
字段合并:
LOGGING = {
'version': 1,
'filters': {
'require_debug_true': {
'()': 'django.utils.log.RequireDebugTrue',
}
},
'handlers': {
'console': {
'level': 'DEBUG',
'filters': ['require_debug_true'],
'class': 'logging.StreamHandler',
}
},
'loggers': {
'django.db.backends': {
'level': 'DEBUG',
'handlers': ['console'],
}
}
}
从@ acardenas89回答调整
答案 1 :(得分:39)
在settings.py
中添加以下粗体语句if DEBUG: import logging l = logging.getLogger('django.db.backends') l.setLevel(logging.DEBUG) l.addHandler(logging.StreamHandler()) LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'filters': { 'require_debug_false': { '()': 'django.utils.log.RequireDebugFalse' } }, 'handlers': { 'mail_admins': { 'level': 'ERROR', 'filters': ['require_debug_false'], 'class': 'django.utils.log.AdminEmailHandler' },'console': { 'level': 'DEBUG', 'class': 'logging.StreamHandler', }, }, 'loggers': { 'django.request': { 'handlers': ['mail_admins'], 'level': 'ERROR', 'propagate': True, },'django.db.backends.sqlite3': { 'level': 'DEBUG', 'handlers': ['console'], }, } }
答案 2 :(得分:17)
也许请查看https://github.com/django-debug-toolbar/django-debug-toolbar
它可以让您查看给定页面生成的所有查询。以及它们出现的堆栈痕迹等。
编辑:要将所有SQL查询记录到文件等,那么您将需要创建一些中间件。中间件可以在每个请求上运行。这方面有几个Django片段:
那些涉及到终端的打印,但要使它们适应使用python的日志库并不困难。
答案 3 :(得分:10)
Django 1.3将所有SQL语句记录到 django.db.backends 记录器:
https://docs.djangoproject.com/en/dev/topics/logging/#django-db-backends
答案 4 :(得分:1)
要在测试期间记录SQL查询,您需要做两件事:
django.db.backends
记录器已启用,并且@override_settings(DEBUG=True)
装饰器。 默认情况下,测试运行程序将set DEBUG=False,而忽略您可能在DJANGO_SETTINGS_MODULE中设置的内容。
最低设置:
# https://docs.djangoproject.com/en/dev/ref/settings/#logging
LOGGING = {
'version': 1,
'handlers': {
'console': {
'class': 'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'level': 'DEBUG',
},
},
'root': {
'handlers': ['console'],
}
}
示例测试用例:
from django.contrib.auth.models import User
from django.test import TestCase, override_settings
class UserTests(TestCase):
# To log queries in tests you need to manually override DEBUG setting
# because testing sets DEBUG=False by default
@override_settings(DEBUG=True)
def test_create_user(self):
User.objects.create()
答案 5 :(得分:0)
您需要将其放在中间件包中。中间件位于webserver / django核心和所有视图之间。它可以在请求之前进行预处理,并在请求完成后进行后处理。例如,将查询保存到文件中。
答案 6 :(得分:0)
您只需要:
@override_settings(DEBUG=True)
如果您已经在runserver
中打印了SQL调试语句。
将装饰器添加到您的class TestA(TestCase)
或test_function
:
@override_settings(DEBUG=True)
class TestA(TestCase):
...
@override_settings(DEBUG=True)
def test_function(self):
...
@Janusz Skonieczny的答案的积分!