如何详细查看Django正在运行的查询?
如何详细查看Django正在运行的查询?
我正在优化我的代码的一个重要部分,因此我试图将数据库访问减少到最小,并尝试通过大而少的查询来获取所有必要的数据并进行缓存。
然而,我还没有找到一种有效的方法来判断Django是否实际上正在对数据库运行查询,还是返回了缓存或预取的数据。
理想情况下,我希望逐行调试代码的相关部分,并在每次执行时显示原始的SQL查询。基本上,我希望有一种监听器,可以在每次查询运行时记录下来。
文档中提到的这种检查正在运行的查询的方法不够好,因为它只显示在访问connection.queries
的同一文件中形成的查询。
访问QuerySet.query
也不行,因为它需要一个QuerySet
对象。还有其他一些情况,查询是针对数据库运行的,但返回类型不是QuerySet
。
我不确定Django Debug Toolbar是否适用,因为我不想将我的行为包装在一个视图中,我想执行一个独立的脚本并进行彻底的调试。
如何详尽地查看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正在运行的查询的几种方法。使用这些方法可以方便地获取查询的详细信息,有助于调试和优化代码。
问题的原因是想要详尽地查看Django正在运行的查询,并且希望能够在代码的中间动态地启用或禁用该配置。另外,还想知道如何改变已记录查询的颜色。
解决方法是通过更改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'], } } }
如果想要在代码的中间动态地启用或禁用该配置,可以尝试以下方法:
import logging logger = logging.getLogger('django.db.backends') logger.setLevel(logging.DEBUG) # 启用配置 # 执行查询语句 logger.setLevel(logging.NOTSET) # 禁用配置
关于更改已记录查询的颜色,尝试使用格式化器,但似乎没有帮助。另一个可能的解决方法是在数据库本身启用日志记录,不过作者表示从未考虑过这一点,并且仍然需要能够动态地启用和禁用日志记录。