如何彻底查看Django正在运行的查询?

3
我正在优化我的代码的一部分,因此我试图将对数据库的访问尽量减少,并尝试在大而少的查询中获取所有必要的数据并进行缓存。
然而,我还没有找到一种有效的方法来查看Django是否实际上正在针对数据库运行查询,或者它是否返回了缓存或预取数据。
理想情况下,我想逐行调试我的代码的相关部分,并显示每个原始SQL查询,就像它们被执行的那样。基本上是一种记录每个查询的侦听器,即在运行时立即记录每个查询。
文档建议的用于检查运行查询的这种方式不够好,因为它只显示在访问connection.queries的同一文件中形成的查询。
访问QuerySet.query也不行,因为它需要一个QuerySet对象。还有其他情况,其中针对数据库运行查询,但返回类型不是QuerySet。

我不确定Django Debug Toolbar是否适用,因为我不想将我的行为包装在视图中,我想执行一个独立的脚本并进行彻底的调试。


1
你尝试过Django日志吗?https://dev59.com/MG855IYBdhLWcg3wYTP_#20161527 - Brown Bear
@BearBrown 看起来符合我的要求。有没有办法在代码中启用或禁用这些日志选项,以便我可以将其缩小到我想要调试的部分?此外,我尝试设置格式化程序以使其颜色不同,但无论我针对 DEBUG 级别、INFO、WARNING、ERROR 或 CRITICAL,它始终是红色的。 - dabadaba
很不幸,我从未使用过它,只是阅读了你的问题和答案。 - Brown Bear
2个回答

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'],
        }
    }
}

有没有办法在代码中间启用/禁用该配置?我该如何更改已记录查询的颜色?我尝试使用格式化程序,但似乎没有帮助。 - dabadaba
你能不能在数据库本身中启用日志记录? - JL Peyret
@JLPeyret 老实说,一开始我甚至没有考虑过这个问题,后来意识到那可能是一个可能性。不过我从未这样做过。但我仍需要启用和禁用它。 - dabadaba

1

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

另一个选择是使用 python manage.py shell 来调用这些查询。你可以使用 django-extensions--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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接