如何查看 Django ORM 查询集的相应 SQL 查询?

有什么方法可以打印 Django ORM 生成的查询?

假设我执行以下语句: Model.objects.filter(name='test')

如何查看生成的 SQL 查询?

117642 次浏览

每个 QuerySet 对象都有一个 query属性,可以将其记录或打印到标准输出以进行调试。

qs = Model.objects.filter(name='test')
print(qs.query)

请注意,在 pdb 中,使用 p qs.query将不能如愿工作,但是 print(qs.query)可以。

如果这不起作用,对于老版本的姜戈,可以尝试:

print str(qs.query)

剪辑

我还使用了自定义模板标记(如 这个片段所示)将查询作为 HTML 注释注入到单个请求的作用域中。

只要 DEBUG开着:

from django.db import connection
print(connection.queries)

对于单个查询,您可以执行以下操作:

print(Model.objects.filter(name='test').query)

也许您应该看看 django-debug-toolbar应用程序,它会为您记录所有查询,显示它们的分析信息等等。

您还可以使用 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
'level': 'DEBUG'
},
},
}

应用程序的另一种方法是生成 html 输出-可以使用 Django 调试工具栏

您可以将这段代码粘贴到您的 shell 中,它将显示所有的 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())

一个健壮的解决方案是让数据库服务器将日志记录到一个文件,然后

tail -f /path/to/the/log/file.log

可以使用 Django debug _ toolbar 查看 SQL 查询。 Debug _ toolbar 使用分步指南:

安装 Debug _ toolbar

pip install django-debug-toolbar

编辑 setings.py 文件并将 debug _ toolbar 添加到已安装的应用程序中,这应该添加到下面的“ django.Contrib.staticfiles”中。还要将 debug _ toolbar 添加到中间件。

Settings.py = > 设置

INSTALLED_APPS= [ 'debug_toolbar']


MIDDLEWARE = ['debug_toolbar.middleware.DebugToolbarMiddleware']

在 setings.py 文件中创建一个名为 INTERNAL _ IPS 的新列表

Py = > 在 setings.py 文件的末尾创建新列表并添加如下列表:

INTERNAL_IPS= [127.0.0.1']

这将允许调试仅在内部开发服务器上运行

编辑 # Project 的 urls.py 文件并添加以下代码:

if settings.DEBUG:
import debug_toolbar
urlpatterns = [
url(r'^__debug__/', include(debug_toolbar.urls))
] + urlpatterns

再次申请迁移并运行服务器

你会在你的网页上看到一个插件,号码是127.0.0.1 & 如果你点击 SQL 查询复选框,你也可以看到查询的运行时间。

如果使用数据库路由,则可能有多个数据库连接。 这样的代码允许您查看会话中的连接。 您可以按照与单个连接相同的方式重置统计信息: 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() )