在 Django shell 会话期间获取 SQL 查询计数

是否有办法打印 Django ORM 在 Django shell 会话期间执行的原始 SQL 查询的数量?

Django 调试工具栏(例如,5 QUERIES in 5.83MS)已经提供了这类信息,但是如何从 shell 获取这类信息并不明显。

42967 次浏览

你可以使用 connection.queries:

>>> from django.conf import settings
>>> settings.DEBUG = True
>>> from django.db import connection
>>> Model.objects.count()
>>> print(len(connection.queries))
1

在某些应用程序(例如 some_app)中,创建一个名为 tra _ import. py 的 python 文件,这是对已接受的答案的一个小小改进

Extra _ imports. py

from django.conf import settings
settings.DEBUG = True
from django.db import connection, reset_queries




def num_queries(reset=True):
print(len(connection.queries))
if reset:
reset_queries()

现在,如果您正在使用 django _ extension 中的 shell _ plus (顺便说一句,如果您没有使用它,请检查一下) ,请将以下代码行添加到 setings.py

SHELL_PLUS_PRE_IMPORTS = [('some_app.extra_imports', '*')]

如果您使用的是 django shell,请在 shell 内部运行此命令

exec(open('some_app/extra_imports.py').read()) # python3
execfile('some_app/extra_imports.py').read()) # pyhton2

或者您可以将 extra_import.py的内容粘贴到 shell 中

现在,

In [1]: User.objects.all()
In [2]: num_queries()
1


In [3]: User.objects.filter(company=Company.objects.first()).all()
In [4]: num_queries()
2

如果您有数据库路由和多个连接,那么计算数据库命中次数就比较麻烦了,因为 connection.queries 只考虑默认连接,据我所知。

包括所有连接:

from django.db import connections,connection,reset_queries
from django.conf import settings
settings.DEBUG = True
...
def query_count_all()->int:
query_total = 0
for c in connections.all():
query_total += len(c.queries)
return query_total

或者更简洁地说:

def query_count_all()->int:
return sum(len(c.queries) for c in connections.all())

reset_queries()已经可以处理多个连接