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

时间:2015-11-20 12:54:14

标签: python django

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

def f():
    start_to_print_queries()

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

    stop_to_print_queries()

2 个答案:

答案 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查询的详细列表。

enter image description here