如何查看Django执行的原始SQL查询?
有没有办法在Django执行查询时显示它正在运行的SQL语句?
26 个回答
71
118
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]
<User: username>
575
查看文档的常见问题解答:“我怎么能看到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。
因此,你不应该直接把查询的输出发送到数据库。
如果你需要重置查询,比如想看看在某个时间段内运行了多少个查询,可以使用reset_queries
,这个功能在django.db
里:
from django.db import reset_queries
from django.db import connection
reset_queries()
# Run your query here
print(connection.queries)
>>> []