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


164

有没有一种方法可以打印Django ORM生成的查询?

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

如何查看生成的SQL查询?

Answers:


178

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

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

编辑

我还使用了自定义模板标签(如本片段所述)将查询作为HTML注释注入单个请求的范围内。


6
.save()查询怎么样?
DataGreed 2010年

@DataGreed好的问题,可能值得在新线程中提问,以便您获得更多答复。
乔·霍洛威

4
是否可以prefetch_related显示2个查询?我只看到
用户

不起作用。我看到了<django.db.models.sql.query.Query object
dopatraman

尝试print(str(qs.query))。我认为他们在10年内已经改变了内部结构
Joe Holloway,

114

您还可以使用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调试工具栏


3
如果有人想有总结与sumup执行的查询数量以及总时间花费:dabapps.com/blog/logging-sql-queries-django-13
andilabs

9
它没有为我工作,我不得不添加'level': 'DEBUG''django.db'
rvernica '16

108

您可以将此代码粘贴到您的外壳上,该外壳将显示所有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())


30

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


3
这非常有用,但是它仅在GUI中有效,有时您希望直接在ORM中查看查询日志。例如,您有一个没有GUI的api!
wim 2013年

3

一个可靠的解决方案是让您的数据库服务器登录到文件,然后

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

2

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

1

您可以使用Django debug_toolbar查看SQL查询。有关debug_toolbar使用的逐步指南:

安装Debug_toolbar

pip install django-debug-toolbar

编辑settings.py文件并将debug_toolbar添加到已安装的应用程序,应在下面将其添加到'django.contrib.staticfiles'中。还将debug_toolbar添加到中间件。

Settings.py =>

INSTALLED_APPS= [ 'debug_toolbar'] 

MIDDLEWARE = ['debug_toolbar.middleware.DebugToolbarMiddleware']

在settings.py文件中创建一个名为INTERNAL_IPS的新列表

Settings.py =>在settings.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查询”复选框,则实际上还可以看到查询的运行时间。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.