如何强制 django 打印每个执行的 sql 查询

drl*_*exa 3 python django

我有一些用python编写的函数。我想知道在这个函数中执行的所有 sql 查询。有没有办法编写类似的代码:

def f():
    start_to_print_queries()

    # ...
    # many many python code
    # ...

    stop_to_print_queries()
Run Code Online (Sandbox Code Playgroud)

?

spe*_*ras 6

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

请注意,这仅适用于调试模式 ( 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()
Run Code Online (Sandbox Code Playgroud)

如果测试失败,Django 将打印所有查询供您检查。