我怎样才能看到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 。

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

看看debug_toolbar ,这对debugging非常有用。

文档和源文件可在http://django-debug-toolbar.readthedocs.io/find

调试工具栏的屏幕截图

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文件有:

  1. CONTEXT_PROCESSORS列出的django.core.context_processors.debug
  2. DEBUG=True
  3. 你的IPINTERNAL_IPS元组中

那么你应该有权访问sql_queriesvariables。 我在每个页面添加页脚,如下所示:

 {%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。