我怎样才能看到Django正在运行的原始SQL查询?
有没有办法显示Django执行查询时正在运行的SQL?
查看文档FAQ:“ 我怎样才能看到Django正在运行的原始SQL查询? ”
django.db.connection.queries
包含SQL查询的列表:
from django.db import connection print connection.queries
Querysets也有一个包含要执行的查询的query
属性 :
print MyModel.objects.filter(name="my name").query
请注意,查询的输出不是有效的SQL,因为:
“Django从来没有实际插入参数:它将查询和参数分别发送到数据库适配器,该适配器执行适当的操作。
从Django错误报告#17741 。
因此,您不应将查询输出直接发送到数据库。
Django扩展有一个带有参数print-sql
的命令shell_plus
./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>
虽然你可以使用提供的代码来实现,但我发现使用debugging工具栏应用程序是显示查询的好工具。 你可以从这里下载github。
这使您可以select显示在给定页面上运行的所有查询以及查询花费的时间。 它还总结了页面上的查询数量和总时间以供快速查看。 这是一个很棒的工具,当你想看看Django ORM在幕后做些什么。 它也有很多其他好的function,你可以使用,如果你喜欢。
q = Query.objects.values('val1','val2','val_etc') print q.query
没有其他答案涵盖这种方法,所以:
我发现迄今为止最有用,最简单,最可靠的方法就是询问你的数据库。 例如在Postgres的Linux上,你可以这样做:
sudo su postgres tail -f /var/log/postgresql/postgresql-8.4-main.log
每个数据库将有略微不同的过程。 在数据库日志中,您不但可以看到原始SQL,而且还可以查看django在系统上的任何连接设置或事务开销。
如果你确定你的settings.py文件有:
- 在
CONTEXT_PROCESSORS
列出的django.core.context_processors.debug
-
DEBUG=True
- 你的
IP
在INTERNAL_IPS
元组中
那么你应该有权访问sql_queries
variables。 我在每个页面添加页脚,如下所示:
{%if sql_queries %} <div class="footNav"> <h2>Queries</h2> <p> {{ sql_queries|length }} Quer{{ sql_queries|pluralize:"y,ies" }}, {{sql_time_sum}} Time {% ifnotequal sql_queries|length 0 %} (<span style="cursor: pointer;" onclick="var s=document.getElementById('debugQueryTable').style;s.disp\ lay=s.display=='none'?'':'none';this.innerHTML=this.innerHTML=='Show'?'Hide':'Show';">Show</span>) {% endifnotequal %} </p> <table id="debugQueryTable" style="display: none;"> <col width="1"></col> <col></col> <col width="1"></col> <thead> <tr> <th scope="col">#</th> <th scope="col">SQL</th> <th scope="col">Time</th> </tr> </thead> <tbody> {% for query in sql_queries %} <tr class="{% cycle odd,even %}"> <td>{{ forloop.counter }}</td> <td>{{ query.sql|escape }}</td> <td>{{ query.time }}</td> </tr> {% endfor %} </tbody> </table> </div> {% endif %}
我通过添加行来获得variablessql_time_sum
context_extras['sql_time_sum'] = sum([float(q['time']) for q in connection.queries])
到django_src / django / core / context_processors.py中的debuggingfunction。
另一个选项,请参阅本文描述的settings.py中的logging选项
http://dabapps.com/blog/logging-sql-queries-django-13/
debug_toolbar减慢你的开发服务器上的每个页面的加载速度,日志logging不会更快。 输出可以转储到控制台或文件,所以用户界面不太好。 但是对于含有大量SQL的视图,由于每次页面加载都很慢,因此可能需要很长时间才能通过debug_toolbardebugging和优化SQL。