代码之家  ›  专栏  ›  技术社区  ›  dabadaba

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

  •  3
  • dabadaba  · 技术社区  · 8 年前

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

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

    理想情况下,我希望逐行调试代码的相关部分,并且每个原始sql查询都应该在执行时显示出来。 本质上是一种监听器,它记录每次运行的查询。

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

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

    我不确定 Django Debug Toolbar 也可以,因为我不想把我的行为包装在一个视图中,我想执行一个独立的脚本并彻底调试它。

    2 回复  |  直到 8 年前
        1
  •  1
  •   Andrey Bondar    8 年前

    你可以试着改变 LOGGING 配置,例如 settings.py (如果您 DEBUG True ):

    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'],
            }
        }
    }
    
        2
  •  1
  •   Luan Fonseca    8 年前

    是的,你应该用 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