2010-01-25 9 views
8

我有一個運行相當多SQL語句的Python/Django應用程序。爲了調試的目的,我想我應該爲我創建一個簡單的視圖,它只列出所有已經運行的SQL語句。使用django.db.connection.queries

根據該文件,該代碼應該足以做到這一點:

from django.db import connection 
    connection.queries 

只要DEBUG爲True。

但是,這並沒有給我任何東西。 DEBUG肯定被設置爲True。這個connection.queries存儲在什麼上下文中?我的意思是,我應該能夠執行一個執行大量SQL語句的頁面,然後切換到我創建的視圖http://myserver/sql,並查看那裏的SQL語句,對吧?當然使用相同的瀏覽器會話...

我沒有檢查是否db.reset_queries()正在任何地方的代碼運行時,會出現它不是。

任何想法,爲什麼connection.queries始終是空的?

回答

17

本是正確的,你只看到當前進程的查詢。您可以在相同視圖或控制檯中使用它,但不能在視圖之間使用它。

,看看有什麼疑問您的看法正在執行的最好方法是使用Django debug toolbar

+0

我會檢查出django調試工具欄。謝謝。 – HaukurHaf 2010-01-26 08:21:19

+0

我從來沒有成功在生產服務器上運行DDT。它似乎只適用於本地運行的Django開發服務器。 – William 2015-01-31 01:51:25

3

我認爲這些查詢存儲在內存中,而不是進程間共享,所以你只能訪問到當前進程所作查詢。

如果我試圖您在./manage.py shell會話粘貼代碼,我只看到我之前在shell會話的查詢。

如果我通過queries從視圖到模板的上下文,並顯示在模板中,我看到的只是在該視圖作出的查詢。不過,這是使用dev服務器。

我假設—,但尚未測試—,如果您在有一個進程服務於多個請求的環境中使用此功能,則會看到每個請求會保存更多的查詢。

+0

好吧,所以我只會在每個請求中工作。這就說得通了。 感謝您指出:-) – HaukurHaf 2010-01-26 08:20:45

7

@Daniel羅斯曼它是一個不錯的主意,但如果你想知道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] 
2
from django.db import connections 
x = connections['rating'] 
x.queries 

So check another connections! 
0

這就是固定對我來說;我用:

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

得到查詢計數。