2024-05-23 07:09:13 发布
网友
有没有办法打印Django ORM在Django shell会话期间执行的原始SQL查询的数量?
这类信息已经由Django调试工具栏(例如,5 QUERIES in 5.83MS)提供了,但是如何从shell中获取还不清楚。
5 QUERIES in 5.83MS
这是对公认答案的一点改进。在某些应用程序中创建一个名为extra_imports.py的python文件(例如some_app)
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 据我所知,只考虑默认连接。
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()已处理多个连接
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
这是对公认答案的一点改进。在某些应用程序中创建一个名为extra_imports.py的python文件(例如
some_app
)额外进口.py
现在,如果您使用的是django_扩展中的shell_plus(如果不使用,请检查一下),请将以下行添加到settings.py
如果您使用的是django shell,请在shell内部运行此命令
现在
如果您有数据库路由和多个连接,那么计算数据库命中率就比较困难,因为
connection.queries
据我所知,只考虑默认连接。包括所有连接:
或者更简洁地说:
reset_queries()
已处理多个连接您可以使用
connection.queries
:相关问题 更多 >
编程相关推荐