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

462 投票
26 回答
320052 浏览
提问于 2025-04-15 12:38

有没有办法在Django执行查询时显示它正在运行的SQL语句?

26 个回答

71

看看debug_toolbar,它在调试时非常有用。

你可以在这里找到它的文档和源代码:http://django-debug-toolbar.readthedocs.io/

debug工具栏的截图

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)
>>> []

撰写回答