如何查看Django运行的原始SQL查询?

18 浏览
0 Comments

如何查看Django运行的原始SQL查询?

有没有一种方法在执行查询时显示Django正在运行的SQL?

admin 更改状态以发布 2023年5月20日
0
0 Comments

Django-extensions有一个命令shell_plus,带有一个参数print-sql

./manage.py shell_plus --print-sql

在django-shell中,所有执行的查询将被打印出来

例如:

User.objects.get(pk=1)
SELECT "auth_user"."id",
       "auth_user"."password",
       "auth_user"."last_login",
       "auth_user"."is_superuser",
       "auth_user"."username",
       "auth_user"."first_name",
       "auth_user"."last_name",
       "auth_user"."email",
       "auth_user"."is_staff",
       "auth_user"."is_active",
       "auth_user"."date_joined"
FROM "auth_user"
WHERE "auth_user"."id" = 1
Execution time: 0.002466s [Database: default]

0
0 Comments

参见文档常见问题解答:“如何查看Django正在运行的原始SQL查询?

django.db.connection.queries包含一个SQL查询列表:

from django.db import connection
print(connection.queries)

查询集还具有包含要执行的查询的query属性

print(MyModel.objects.filter(name="my name").query)

请注意,查询的输出不是有效的SQL,因为:

“Django实际上从不插值参数:它将查询和参数分别发送给数据库适配器,后者执行适当的操作。”

来源于Django的错误报告#17741

因此,您不应该直接将查询输出发送到数据库。

如果您需要重置查询,例如查看在给定期间运行了多少查询,则可以使用django.db中的reset_queries

from django.db import reset_queries
from django.db import connection
reset_queries()
# Run your query here
print(connection.queries)
>>> []

0