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

hjzp0vay  于 2022-12-24  发布在  Go
关注(0)|答案(8)|浏览(147)

有没有办法打印Django ORM生成的查询?
假设我执行以下语句:第一个月
如何查看生成的SQL查询?

cetgtptt

cetgtptt1#

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

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

请注意,在pdb中,使用p qs.query将无法按预期工作,但print(qs.query)可以。
如果这不起作用,对于旧版Django,请尝试:

print str(qs.query)
    • 编辑**

我还使用了定制模板标记(如this snippet中所述)将查询作为HTML注解注入到单个请求的范围中。

j13ufse2

j13ufse22#

你也可以使用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 debug toolbar

sz81bmfz

sz81bmfz3#

你可以把这段代码粘贴到Django shell上,它会显示所有的SQL查询:

import logging
l = logging.getLogger('django.db.backends')
l.setLevel(logging.DEBUG)
l.addHandler(logging.StreamHandler())
qpgpyjmq

qpgpyjmq4#

只要DEBUG处于打开状态:

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

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

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

juzqafwq5#

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

ljo96ir5

ljo96ir56#

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

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

ubof19bj7#

如果使用数据库路由,则可能有多个数据库连接。类似下面的代码可以让您查看会话中的连接。您可以使用与单个连接相同的方法重置统计信息:第一个月

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() )
eeq64g8w

eeq64g8w8#

您可以使用Django debug_toolbar来查看SQL查询。debug_toolbar的使用指南:

安装调试工具栏

pip install django-debug-toolbar

Edit settings.py file & add debug_toolbar to Installed apps, this should be added below to 'django.contrib.staticfiles'. Also add debug_toolbar to Middleware.

Settings.py=>

INSTALLED_APPS= [ 'debug_toolbar'] 

MIDDLEWARE = ['debug_toolbar.middleware.DebugToolbarMiddleware']

create a new list named INTERNAL_IPS in settings.py file

Settings.py=> create new list at the end of settings.py file & add below list:

INTERNAL_IPS= [127.0.0.1']

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

Edit urls.py file of #Project & add below code:

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

应用迁移并再次运行服务器

You will see an add-on on your web page at 127.0.0.1 & if you click on SQL Query check box, you can actually see the run time of query as well.

相关问题