12

我有一个运行大量 SQL 语句的 Python/Django 应用程序。出于调试目的,我想我应该为我创建一个简单的视图,它只列出所有已运行的 SQL 语句。

根据文档,这段代码应该足以做到这一点:

    from django.db import connection
    connection.queries

只要 DEBUG 为 True。

但是,这并没有给我任何东西。DEBUG 肯定设置为 True。这个 connection.queries 存储在什么上下文中?我的意思是,我应该能够执行一个执行大量 SQL 语句的页面,然后切换到我创建的http://myserver/sql视图并在那里查看那些 SQL 语句,对吗?当然使用相同的浏览器会话......

我确实检查了 db.reset_queries() 是否在代码中的任何地方运行,似乎不是。

任何想法为什么 connection.queries 总是空的?

4

5 回答 5

20

Ben 是对的,您只能看到来自当前进程的查询。您可以在同一视图内或控制台中使用它,但不能在视图之间使用。

查看视图中正在执行的查询的最佳方法是使用Django 调试工具栏

于 2010-01-25T17:11:50.270 回答
9

@Daniel Roseman 是个好主意,但是如果您想立即了解 sql 查询:

安装django-command-extensions并将其添加到已安装的应用程序中。它将在您的项目中添加许多 utils 命令,其中之一:

  • debugsqlshell:输出在 Python 交互式 shell 中工作时执行的 SQL。

例子: python manage.py debugsqlshell

In [1]:from django.contrib.auth.models import User
In [1]:User.objects.all()

Out[2]: SELECT "auth_user"."id",
   "auth_user"."username",
   "auth_user"."first_name",
   "auth_user"."last_name",
   "auth_user"."email",
   "auth_user"."password",
   "auth_user"."is_staff",
   "auth_user"."is_active",
   "auth_user"."is_superuser",
   "auth_user"."last_login",
   "auth_user"."date_joined"
    FROM "auth_user" LIMIT 21  [1.25ms]
于 2012-04-23T14:09:34.577 回答
3

我认为这些查询存储在内存中,而不是在进程之间共享,因此您只能访问当前进程所做的查询。

如果我尝试您在会话中粘贴的代码./manage.py shell,我只会看到我之前在该 shell 会话中所做的查询。

如果我queries从视图传递到模板上下文并在模板中显示它,我只会看到在该视图中进行的查询。不过,这是使用开发服务器。

我假设(但尚未测试)如果您在一个进程服务多个请求的环境中使用它,您会看到每个请求都保存了更多查询。

于 2010-01-25T16:45:50.873 回答
2
from django.db import connections
x = connections['rating']
x.queries

So check another connections!
于 2013-02-20T08:01:54.320 回答
0

这就是为我解决的问题;我用了:

reduce(lambda n, name: n + connections[name].queries, connections, 0)

获取查询计数。

于 2015-05-09T09:04:54.357 回答