我有一些用python编写的函数。我想知道在这个函数中执行的所有sql查询。有没有办法编写类似的东西:
def f():
start_to_print_queries()
# ...
# many many python code
# ...
stop_to_print_queries()
答案 0 :(得分:1)
您可以使用django测试工具捕获连接上的查询。假设默认连接,这样的事情应该起作用:
from django.db import connection
from django.test.utils import CaptureQueriesContext
def f():
with CaptureQueriesContext(connection) as queries:
# ...
# many many python code
# ...
print(len(queries.captured_queries))
请注意,这仅适用于调试模式(settings.DEBUG = True
),因为它依赖于引发查询的引擎。如果您使用多个连接,只需替换您感兴趣的连接。
如果您对查询的详细信息感兴趣,queries.captured_queries
包含详细信息:sql代码,参数和每个请求的时间。
此外,如果您需要在构建测试用例时对查询进行计数,则可以简单地断言数字,如下所示:
def test_the_function_queries(self):
with self.assertNumQueries(42): # check the_function does 42 queries.
the_function()
如果测试失败,Django将打印所有查询供你检查。
答案 1 :(得分:1)
我会推荐优秀的django-debug-toolbar套餐。它允许您以交互方式检查视图中执行的SQL语句,甚至提供分析信息。
你可以从pip获得它:
pip install django-debug-toolbar
将其包含在settings.INSTALLED_APPLICATIONS
:
INSTALLED_APPS = (
# ...
'django.contrib.staticfiles',
# ...
'debug_toolbar',
)
使用DEBUG=True
执行项目时,您应该会在右上角看到一个DjDT按钮。
扩展SQL选项卡将为您提供sql查询的详细列表。