django orm,如何查看(或记录)执行的查询?

158 django django-models django-orm

有没有办法可以打印Django ORM生成的查询?

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

如何查看生成的SQL查询?

Joe*_*way 172

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

qs = Model.objects.filter(name='test')
print qs.query
Run Code Online (Sandbox Code Playgroud)

编辑

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

  • 对.save()的查询怎么样? (6认同)
  • 它是否适用于`prefetch_related`即显示2个查询?我只看到1. (4认同)
  • 这是所有查询的解决方案:http://stackoverflow.com/a/5835465/110274 (3认同)

ais*_*baa 112

您还可以使用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
        },
    },
}
Run Code Online (Sandbox Code Playgroud)

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

  • 它对我不起作用,我不得不在''django.db'`下添加''level':'DEBUG'. (8认同)
  • 如果有人希望**总结****执行查询数****以及**总时间**花了:http://www.dabapps.com/blog/logging-sql-queries -django-13 / (3认同)

Pra*_*mod 103

您可以在解释器上粘贴此代码,该解释器将显示所有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())
Run Code Online (Sandbox Code Playgroud)


Dan*_*man 70

只要DEBUG是:

from django.db import connection
print(connection.queries)
Run Code Online (Sandbox Code Playgroud)

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

print(Model.objects.filter(name='test').query)
Run Code Online (Sandbox Code Playgroud)

  • 读者注意:[`query`从Djagno 1.2开始返回`Query`对象](http://stackoverflow.com/questions/2900057/django-1-2-equivalent-of-queryset-query-as-sql/2900079# 2900079)没有`as_sql`属性. (22认同)

Mik*_*bov 30

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

  • 这非常有用,但是它仅在GUI中有效,有时您希望直接在ORM中查看查询日志。例如,您有一个没有GUI的api! (2认同)