【问题标题】:How to force django to print each executed sql query如何强制 django 打印每个执行的 sql 查询
【发布时间】:2016-02-22 23:23:03
【问题描述】:

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

def f():
    start_to_print_queries()

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

    stop_to_print_queries()

?

【问题讨论】:

  • 您需要它来做一些特别的事情,还是只是为了调试?还是用于测试用例?
  • 因为django ORM我不知道实际执行了多少sql查询。我想知道这个计数。

标签: python django


【解决方案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 将打印所有查询供您检查。

【讨论】:

    【解决方案2】:

    我会推荐优秀的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 查询的详细列表。

    【讨论】:

      猜你喜欢
      • 2012-04-12
      • 2019-03-30
      • 1970-01-01
      • 2021-04-06
      • 1970-01-01
      • 2019-07-22
      • 2020-01-24
      • 2011-08-10
      • 2017-01-04
      相关资源
      最近更新 更多