如何穷尽查询 Django is 运行?
How to exhaustively see queries Django is running?
我正在优化我的大部分代码,因此我试图将数据库命中率降至最低,并尝试在大但很少的查询中获取所有必要的数据并缓存它。
然而,我还没有找到一种有效的方法来查看 Django 是否真的在 运行 对数据库进行查询,或者它是否在 return 缓存或预取数据。
理想情况下,我想逐行调试代码的相关部分,每个原始 SQL 查询都应在执行时显示。 本质上是某种侦听器,它会在 运行 时记录每个 运行 的查询。
This 检查文档建议的 运行ning 查询的方法不够好,因为它显然只显示在您访问 connection.queries
的同一文件中形成的查询。
访问 QuerySet.query
也不好,因为它需要一个 QuerySet
对象。在其他情况下,查询是针对数据库 运行 但 return 类型不是 QuerySet
.
我不确定 Django Debug Toolbar 是否有效,因为我不希望我的行为包含在视图中,我想执行一个独立的脚本并彻底调试它。
您可以尝试更改 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'],
}
}
}
是的,您应该为此使用 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
我正在优化我的大部分代码,因此我试图将数据库命中率降至最低,并尝试在大但很少的查询中获取所有必要的数据并缓存它。
然而,我还没有找到一种有效的方法来查看 Django 是否真的在 运行 对数据库进行查询,或者它是否在 return 缓存或预取数据。
理想情况下,我想逐行调试代码的相关部分,每个原始 SQL 查询都应在执行时显示。 本质上是某种侦听器,它会在 运行 时记录每个 运行 的查询。
This 检查文档建议的 运行ning 查询的方法不够好,因为它显然只显示在您访问 connection.queries
的同一文件中形成的查询。
访问 QuerySet.query
也不好,因为它需要一个 QuerySet
对象。在其他情况下,查询是针对数据库 运行 但 return 类型不是 QuerySet
.
我不确定 Django Debug Toolbar 是否有效,因为我不希望我的行为包含在视图中,我想执行一个独立的脚本并彻底调试它。
您可以尝试更改 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'],
}
}
}
是的,您应该为此使用 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