【问题标题】:How to exhaustively see queries Django is running?如何详尽地查看 Django 正在运行的查询?
【发布时间】:2018-11-16 03:45:47
【问题描述】:

我正在优化我的大部分代码,因此我试图将数据库命中率降至最低,并尝试在大但很少的查询中抓取所有必要的数据并将其缓存。

但是我还没有找到一种有效的方法来查看 Django 是否真的在对数据库运行查询,或者它是否正在返回缓存或预取的数据。

理想情况下,我想逐行调试代码的相关部分,并且每个原始 SQL 查询都应在执行时显示。 本质上是某种侦听器,它会在运行后立即记录每个运行的查询。

This 检查文档建议的正在运行的查询的方法不够好,因为它显然只显示在您访问 connection.queries 的同一文件中形成的查询。

访问QuerySet.query 也不好,因为它需要一个QuerySet 对象。在其他情况下,对数据库运行查询但返回类型不是QuerySet

我也不确定Django Debug Toolbar 是否会起作用,因为我不希望我的行为包含在视图中,我想执行一个独立的脚本并彻底调试它。

【问题讨论】:

  • @BearBrown 似乎符合我的要求。有什么方法可以在代码中启用或禁用这些日志记录选项,以便我可以将其缩小到我想要调试的部分?此外,我尝试设置一个格式化程序以不同的方式着色,但它始终为红色,无论我的目标是调试级别、信息、警告、错误还是严重。
  • 不幸的是我从来没有使用它只是阅读你的问题和答案

标签: python django django-1.8


【解决方案1】:

您可以尝试更改LOGGING 配置,例如在您的settings.py 中(如果您的DEBUGTrue,则记录您的所有查询):

LOGGING = {
    'version': 1,
    'filters': {
        'require_debug_true': {
            '()': 'django.utils.log.RequireDebugTrue',
        }
    },
    'handlers': {
        'console': {
            'level': 'DEBUG',
            'filters': ['require_debug_true'],
            'class': 'logging.StreamHandler',
        }
    },
    'loggers': {
        'django.db.backends': {
            'level': 'DEBUG',
            'handlers': ['console'],
        }
    }
}

【讨论】:

  • 有没有办法在代码中间启用/禁用该配置?以及如何更改已记录查询的颜色?我尝试使用格式化程序,但似乎没有帮助。
  • 您不能在数据库本身中启用日志记录吗?
  • @JLPeyret 老实说,一开始我什至从未想过这一点,然后意识到这可能是一种可能性。我从来没有这样做过。不过,我仍然需要启用和禁用它。
【解决方案2】:

是的,您应该为此使用django-debug-toolbar。它将显示在某个视图上进行的每个查询,如果您想要的代码类似于,在某个模型或其他 python 文件中,并且有时会为某个视图调用。例如,即使它是模型上的signal。它将被调试工具栏捕获。

另一个选项是你使用python manage.py shell 来调用这些查询。您可以使用django-extensions with the --print-sql 参数来显示它。

或者,打印它自己的 sql,我通常这样做:

>>> qs = User.objects.filter(username='luan')
>>> print(qs.query)
SELECT "users_user"."id", "users_user"."password", "users_user"."last_login", "users_user"."is_superuser", "users_user"."username", "users_user"."first_name", "users_user"."last_name", "users_user"."email", "users_user"."is_staff", "users_user"."is_active", "users_user"."date_joined", "users_user"."ref_id", "users_user"."created_on", "users_user"."updated_on" FROM "users_user" WHERE "users_user"."username" = luan ORDER BY "users_user"."id" ASC

【讨论】:

    猜你喜欢
    • 2020-08-03
    • 2012-10-21
    • 2012-01-02
    • 2011-11-10
    • 2011-11-11
    • 2018-06-02
    • 1970-01-01
    • 2017-05-14
    • 2010-11-01
    相关资源
    最近更新 更多