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

Jia*_*ian 45 python sql django shell

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

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

Jia*_*ian 69

你可以使用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
Run Code Online (Sandbox Code Playgroud)

  • 我最喜欢的一个.对此有用:`django.db.reset_queries`重置该计数. (8认同)
  • 尝试使用Django 1.11这个方法,它工作得非常好! (7认同)
  • 不幸的是,这似乎不适用于Django 1.5,查询计数保持为0 (5认同)
  • 注意,这将从9000开始停止计数。请参见`BaseDatabaseWrapper.queries_limit`。 (5认同)

Nit*_*hin 13

这对接受的答案略有改进。在某些应用程序中创建一个名为 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()
Run Code Online (Sandbox Code Playgroud)

现在,如果您正在使用 django_extension 中的 shell_plus(顺便说一句,如果您不使用它,请检查它),将以下行添加到 settings.py

SHELL_PLUS_PRE_IMPORTS = [('some_app.extra_imports', '*')]
Run Code Online (Sandbox Code Playgroud)

如果您使用的是 django shell,请在 shell 中运行它

exec(open('some_app/extra_imports.py').read()) # python3
execfile('some_app/extra_imports.py').read()) # pyhton2
Run Code Online (Sandbox Code Playgroud)

现在,

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
Run Code Online (Sandbox Code Playgroud)


Tim*_*son 7

如果你有数据库路由和多个连接,计算你的数据库命中有点棘手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
Run Code Online (Sandbox Code Playgroud)

或更简洁地说:

def query_count_all()->int:
   return sum(len(c.queries) for c in connections.all())
Run Code Online (Sandbox Code Playgroud)

reset_queries() 已经处理多个连接