2010-01-25 3 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

Ben은 현재 프로세스의 쿼리 만 볼 수 있습니다. 동일한보기 또는 콘솔에서 사용할 수 있지만보기 간에는 사용할 수 없습니다.

보기에서 실행중인 쿼리를 확인하는 가장 좋은 방법은 Django debug toolbar을 사용하는 것입니다.

+0

장고 디버그 툴바를 살펴 보겠습니다. 고맙습니다. – HaukurHaf

+0

프로덕션 서버에서 DDT를 성공적으로 실행 한 적이 없습니다. 로컬로 실행되는 장고의 개발 서버에서만 작동하는 것 같습니다. – William

3

이 쿼리는 메모리에 저장되어 프로세스간에 공유되지 않으므로 현재 프로세스에서 수행 한 쿼리에만 액세스 할 수 있다고 생각합니다.

./manage.py shell 세션에 붙여 넣은 코드를 사용하면 이전에 해당 셸 세션에서 작성한 쿼리 만 볼 수 있습니다.

뷰에서 템플릿 컨텍스트로 queries을 전달하고 템플릿에 표시하면 해당 뷰에서 작성된 쿼리 만 표시됩니다. 이것은 dev 서버를 사용하고 있습니다.

나는 —으로 가정하지만 하나의 프로세스가 여러 요청을 처리하는 환경에서이 값을 사용하면 더 많은 쿼리가 각 요청에 저장되는 것을 볼 수 있습니다.

+0

좋아, 그럼 각 요청 내에서만 작동합니다. 그건 의미가 있습니다. 지적 해 주셔서 감사합니다 :-) – HaukurHaf

7

@Daniel Roseman의 좋은 생각,하지만 당신은 밖으로 상자의 SQL 쿼리를 알고 싶다면 :

django-command-extensions를 설치하고 설치된 앱에 추가합니다.

  • debugsqlshell : 출력이 파이썬 대화 형 쉘에서 작업 실행 가져옵니다 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) 

쿼리 카운트를 얻으려면.