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

时间:2018-06-06 12:41:52

标签: python django django-1.8

我正在优化我的代码的很大一部分,所以我试图将数据库命中率降到最低,并尝试在大而少的查询中获取所有必要的数据并缓存它。

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

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

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

访问QuerySet.query也不好,因为它需要一个,QuerySet}对象。还有其他方案,对数据库运行查询但返回类型不是QuerySet

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

2 个答案:

答案 0 :(得分: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'],
        }
    }
}

答案 1 :(得分:1)

是的,您应该使用django-debug-toolbar。它将显示在某些视图上进行的每个查询,如果您想要的代码是,在某些Model或其他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