Использование django.db.connection.queries - PullRequest
9 голосов
/ 25 января 2010

У меня есть приложение Python / Django, которое выполняет довольно много SQL-операторов. В целях отладки я подумал, что должен создать для меня простое представление, которое просто перечисляет все выполненные операторы SQL.

Согласно документации, этого кода должно быть достаточно для:

    from django.db import connection
    connection.queries

до тех пор, пока DEBUG равен True.

Однако это ничего мне не дает. Для DEBUG наверняка установлено значение True. В каком контексте хранится этот connection.queries? Я имею в виду, я должен быть в состоянии выполнить одну страницу, которая выполняет много SQL-операторов, а затем просто переключиться на созданное мной представление http://myserver/sql и увидеть там эти SQL-операторы, верно? Конечно, используя тот же сеанс браузера ...

Я проверил, запускается ли db.reset_queries () где-нибудь в коде, похоже, что это не так.

Есть идеи, почему connection.queries всегда пуст?

Ответы [ 5 ]

18 голосов
/ 25 января 2010

Бен прав, что вы видите только запросы из текущего процесса. Вы можете использовать его в одном представлении или в консоли, но не между представлениями.

Лучший способ узнать, какие запросы выполняются в ваших представлениях, - это использовать панель инструментов отладки Django .

9 голосов
/ 23 апреля 2012

@ Даниэль Роузман - хорошая идея, но если вы хотите узнать sql-запросы из коробки:

установить django-command-extensions и добавить его в установленные приложения. в ваш проект будет добавлено много команд utils, одна из них:

  • debugsqlshell: выводит SQL, который выполняется при работе в интерактивной оболочке Python.

пример: 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]
3 голосов
/ 25 января 2010

Я думаю, что эти запросы хранятся в памяти и не распределяются между процессами, поэтому у вас будет доступ только к запросам, сделанным текущим процессом.

Если я попробую код, который вы вставили в сеансе ./manage.py shell, я увижу только те запросы, которые были сделаны ранее в этом сеансе оболочки.

Если я передам queries из представления в контекст шаблона и покажу его в шаблоне, я увижу только запросы, сделанные в этом представлении. Это использует сервер разработки, хотя.

Я предполагаю & mdash; но не проверял & mdash; что если вы используете это в среде, в которой один процесс обслуживает несколько запросов, вы увидите, что при каждом запросе будет сохраняться больше запросов.

2 голосов
/ 20 февраля 2013
from django.db import connections
x = connections['rating']
x.queries

So check another connections!
0 голосов
/ 09 мая 2015

Это то, что исправило это для меня; Я использовал:

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

, чтобы получить количество запросов.

...