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

2024-05-23 07:09:13 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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


Tags: djangoin信息sql数量ormshellms
3条回答

这是对公认答案的一点改进。在某些应用程序中创建一个名为extra_imports.py的python文件(例如some_app

额外进口.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_扩展中的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

现在

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()已处理多个连接

您可以使用connection.queries

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

相关问题 更多 >

    热门问题