如何详细查看Django正在运行的查询?

27 浏览
0 Comments

如何详细查看Django正在运行的查询?

我正在优化我的代码的一个重要部分,因此我试图将数据库访问减少到最小,并尝试通过大而少的查询来获取所有必要的数据并进行缓存。

然而,我还没有找到一种有效的方法来判断Django是否实际上正在对数据库运行查询,还是返回了缓存或预取的数据。

理想情况下,我希望逐行调试代码的相关部分,并在每次执行时显示原始的SQL查询。基本上,我希望有一种监听器,可以在每次查询运行时记录下来。

文档中提到的这种检查正在运行的查询的方法不够好,因为它只显示在访问connection.queries的同一文件中形成的查询。

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

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

0
0 Comments

如何详尽地查看Django正在运行的查询?

在Django中,有几种方法可以详细查看正在运行的查询。一种方法是使用django-debug-toolbar插件。这个插件可以在视图中显示每个查询,无论这些代码是在模型中还是在其他Python文件中,有时候它会在某个视图中被调用,甚至可能作为模型中的信号。使用debug-toolbar插件可以捕获到这些查询。

另一种方法是使用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

以上是查看Django正在运行的查询的几种方法。使用这些方法可以方便地获取查询的详细信息,有助于调试和优化代码。

0
0 Comments

问题的原因是想要详尽地查看Django正在运行的查询,并且希望能够在代码的中间动态地启用或禁用该配置。另外,还想知道如何改变已记录查询的颜色。

解决方法是通过更改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'],
        }
    }
}

如果想要在代码的中间动态地启用或禁用该配置,可以尝试以下方法:

import logging
logger = logging.getLogger('django.db.backends')
logger.setLevel(logging.DEBUG)  # 启用配置
# 执行查询语句
logger.setLevel(logging.NOTSET)  # 禁用配置

关于更改已记录查询的颜色,尝试使用格式化器,但似乎没有帮助。另一个可能的解决方法是在数据库本身启用日志记录,不过作者表示从未考虑过这一点,并且仍然需要能够动态地启用和禁用日志记录。

0