2010-01-25 8 views
8

Mam aplikację Python/Django, która działa dość dużo instrukcji SQL. Do celów debugowania, myślałem, że powinienem stworzyć dla mnie prosty widok, który po prostu wylistuje wszystkie uruchomione instrukcje SQL.Używanie django.db.connection.queries

Zgodnie z dokumentacją, kod ten powinien być wystarczający, aby to zrobić:

from django.db import connection 
    connection.queries 

tak długo jak DEBUG jest True.

Jednak to nic mi nie daje. DEBUG jest z pewnością ustawiony na True. W jakim kontekście jest to połączenie. Zapytania przechowywane? Mam na myśli, powinienem być w stanie wykonać jedną stronę, która wykonuje wiele instrukcji SQL, a następnie po prostu przejść do utworzonego widoku http://myserver/sql i zobaczyć tam te instrukcje SQL, prawda? Używając tej samej sesji przeglądarki oczywiście ...

Sprawdziłem, czy db.reset_queries() był uruchamiany w dowolnym miejscu w kodzie, wydaje się, że nie jest.

Wszelkie pomysły, dlaczego connection.queries jest zawsze pusty?

Odpowiedz

17

Ben ma rację, że wyświetlane są tylko zapytania z bieżącego procesu. Możesz go używać w tym samym widoku lub w konsoli, ale nie między widokami.

Najlepszym sposobem sprawdzenia, które zapytania są wykonywane w widokach, jest użycie Django debug toolbar.

+0

Sprawdzę pasek narzędzi debugowania django. Dziękuję Ci. – HaukurHaf

+0

Nigdy nie miałem żadnego sukcesu w uruchamianiu DDT na serwerze produkcyjnym. Wydaje się, że działa tylko z serwerem deweloperskim Django działającym lokalnie. – William

3

Myślę, że te zapytania są przechowywane w pamięci i nie są współdzielone między procesami, więc będziesz mieć dostęp tylko do zapytań wykonanych przez bieżący proces.

Jeśli spróbuję kodu wklejonego w sesji ./manage.py shell, widzę tylko zapytania, które wcześniej wykonałem w tej sesji powłoki.

Jeśli przejdę queries z widoku do kontekstu szablonu i pokażę go w szablonie, widzę tylko kwerendy wykonane w tym widoku. Jest to jednak użycie serwera deweloperskiego.

Zakładam, że — ale nie przetestowałem —, że jeśli użyjesz tego w środowisku, w którym masz jeden proces obsługujący wiele żądań, zobaczysz więcej zapytań zapisanych w każdym żądaniu.

+0

OK, więc to będzie działać tylko w ramach każdego żądania. To ma sens. Dzięki za wskazanie, że :-) – HaukurHaf

7

@Daniel Roseman to dobry pomysł, ale jeśli chcesz wiedzieć sql zapytania z pudełka:

django-command-extensions zainstalować i dodać go do zainstalowanych aplikacji. będzie dodać wiele poleceń Utils do projektu, jednym z nich:

  • debugsqlshell: wyjścia SQL, który zostanie wykonany podczas pracy w Pythonie interaktywnej powłoki.

przykład: 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

To, co ustalone to dla mnie; Użyłem:

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

, aby uzyskać liczbę zapytań.