有没有办法可以打印Django ORM生成的查询?
假设我执行以下语句:Model.objects.filter(name='test')
如何查看生成的SQL查询?
答案 0 :(得分:155)
每个QuerySet对象都有一个query
属性,您可以将其记录或打印到stdout以进行调试。
qs = Model.objects.filter(name='test')
print qs.query
修改强>
我还使用自定义模板标记(如this snippet中所述)将查询作为HTML注释注入单个请求的范围。
答案 1 :(得分:111)
您还可以使用python日志记录来记录Django生成的所有查询。只需将其添加到您的设置文件中即可。
LOGGING = {
'disable_existing_loggers': False,
'version': 1,
'handlers': {
'console': {
# logging handler that outputs log messages to terminal
'class': 'logging.StreamHandler',
'level': 'DEBUG', # message level to be written to console
},
},
'loggers': {
'': {
# this sets root level logger to log debug and higher level
# logs to console. All other loggers inherit settings from
# root level logger.
'handlers': ['console'],
'level': 'DEBUG',
'propagate': False, # this tells logger to send logging message
# to its parent (will send if set to True)
},
'django.db': {
# django also has database level logging
},
},
}
在应用程序生成html输出的另一种方法 - django debug toolbar可以使用。
答案 2 :(得分:98)
您可以将此代码粘贴到解释器上,该解释器将显示所有SQL查询:
# To get all sql queries sent by Django from py shell
import logging
l = logging.getLogger('django.db.backends')
l.setLevel(logging.DEBUG)
l.addHandler(logging.StreamHandler())
答案 3 :(得分:68)
只要DEBUG
开启:
from django.db import connection
print(connection.queries)
对于单个查询,您可以执行以下操作:
print(Model.objects.filter(name='test').query)
答案 4 :(得分:29)
也许您应该查看django-debug-toolbar
应用程序,它会记录所有查询,显示它们的分析信息等等。
答案 5 :(得分:2)
一个强大的解决方案是让您的数据库服务器登录到文件然后
tail -f /path/to/the/log/file.log
答案 6 :(得分:1)
您可以使用Django debug_toolbar来查看SQL查询。 debug_toolbar用法的分步指南:
pip install django-debug-toolbar
Settings.py =>
INSTALLED_APPS= [ 'debug_toolbar']
MIDDLEWARE = ['debug_toolbar.middleware.DebugToolbarMiddleware']
Settings.py =>在settings.py文件的末尾创建新列表&添加以下列表:
INTERNAL_IPS= [127.0.0.1']
这将允许调试仅在内部开发服务器上运行
if settings.DEBUG:
import debug_toolbar
urlpatterns = [
url(r'^__debug__/', include(debug_toolbar.urls))
] + urlpatterns
您将在网页上看到一个加载项,地址为127.0.0.1&如果单击“SQL查询”复选框,则实际上也可以看到查询的运行时间。
答案 7 :(得分:0)
如果使用数据库路由,则可能有多个数据库连接。
这样的代码使您可以查看会话中的连接。
您可以使用与单个连接相同的方式重置统计信息:reset_queries()
from django.db import connections,connection,reset_queries
...
reset_queries() # resets data collection, call whenever it makes sense
...
def query_all():
for c in connections.all():
print(f"Queries per connection: Database: {c.settings_dict['NAME']} {c.queries}")
# and if you just want to count the number of queries
def query_count_all()->int:
return sum(len(c.queries) for c in connections.all() )