【发布时间】:2013-11-02 13:58:37
【问题描述】:
有没有办法在 Django shell 会话期间打印 Django ORM 执行的原始 SQL 查询的数量?
此类信息已由 Django 调试工具栏提供(例如,5 QUERIES in 5.83MS,但如何从 shell 中获取它并不明显。
【问题讨论】:
有没有办法在 Django shell 会话期间打印 Django ORM 执行的原始 SQL 查询的数量?
此类信息已由 Django 调试工具栏提供(例如,5 QUERIES in 5.83MS,但如何从 shell 中获取它并不明显。
【问题讨论】:
你可以使用connection.queries:
>>> from django.conf import settings
>>> settings.DEBUG = True
>>> from django.db import connection
>>> Model.objects.count()
>>> print(len(connection.queries))
1
【讨论】:
django.db.reset_queries 重置该计数。
BaseDatabaseWrapper.queries_limit
这是对已接受答案的轻微改进。在某些应用程序中创建一个名为 extra_imports.py 的 python 文件(例如some_app)
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(如果您不使用它,请检查一下),将以下行添加到 settings.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() 已经处理了多个连接
【讨论】: