Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何详尽地查看Django正在运行的查询?_Python_Django_Django 1.8 - Fatal编程技术网

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

Python 如何详尽地查看Django正在运行的查询?,python,django,django-1.8,Python,Django,Django 1.8,我正在优化我的大部分代码,因此我试图将数据库命中率降至最低,并尝试在大而少的查询中获取所有必要的数据,并将其缓存 但是,我还没有找到一种有效的方法来判断Django是否正在对数据库运行查询,或者它是否返回缓存或预取的数据 理想情况下,我希望逐行调试代码的相关部分,每个原始SQL查询都应该在执行时显示出来本质上是一种监听器,它在运行每个查询时立即记录它。 检查文档建议的正在运行的查询的方法还不够好,因为它只显示在您访问connection.querys的同一文件中形成的查询 访问QuerySet.

我正在优化我的大部分代码,因此我试图将数据库命中率降至最低,并尝试在大而少的查询中获取所有必要的数据,并将其缓存

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

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

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

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


我也不确定该脚本是否有效,因为我不想将我的行为包装在视图中,我想执行一个独立的脚本并彻底调试它。

您可以尝试更改
日志记录
配置,例如在
设置.py
中(如果
调试
True
,则记录所有查询):


是的,您应该使用
django调试工具栏
。它将显示在某个视图上进行的每个查询,如果您想要的代码是类似的,则显示在某个模型或其他python文件中,有时为某个视图调用。例如,即使它在模型上是一个
信号
。它将被调试工具栏捕获

另一个选项是使用
python manage.py shell
调用这些查询。您可以使用该参数来显示它

或者,自己打印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 log@BearBrown,它似乎符合我的要求。有没有办法在代码中启用或禁用这些日志记录选项,以便将其缩小到要调试的部分?此外,我试着设置一个格式化程序来对它进行不同的颜色,但是它总是红色的,不管我是针对调试级别、信息、警告、错误还是批判性的。不幸的是,我从来没有使用它,只是读了你的问题和答案,有没有办法在代码的中间启用/禁用那个配置权?如何更改已记录查询的颜色?我尝试使用格式化程序,但似乎没有帮助。你不能启用数据库本身的日志记录吗?@JLPeyret老实说,一开始我甚至没有想过,后来意识到这可能是一种可能性。但我从来没有这样做过。但我仍然需要启用和禁用它。
>>> 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