Есть ли способ показать SQL, который работает Django при выполнении запроса?
308
См. Часто задаваемые вопросы по документам: « Как я могу увидеть необработанные SQL-запросы, выполняемые Django? »
django.db.connection.queries
содержит список запросов SQL:
from django.db import connection
print(connection.queries)
Querysets также имеют query
атрибут, содержащий запрос, который будет выполнен:
print(MyModel.objects.filter(name="my name").query)
Обратите внимание, что вывод запроса не является допустимым SQL, потому что:
«На самом деле Django никогда не интерполирует параметры: он отправляет запрос и параметры отдельно адаптеру базы данных, который выполняет соответствующие операции».
Из сообщения об ошибке Django № 17741 .
Из-за этого вам не следует отправлять вывод запроса непосредственно в базу данных.
str()
функцию Pythonian , которая вызывает внутренний__str__()
метод. Например,str(MyModel.objects.filter(name="my name").query)
я бы также рекомендовал использовать IPython и оболочку Django вашего проекта. Завершение вкладки затем обеспечивает самоанализ объекта. Так как Django известен своими утвержденными схемами именования, эта методология имеет тенденцию быть очень полезной.query
не является допустимым SQL, потому что «Django никогда не интерполирует параметры: он отправляет запрос и параметры отдельно адаптеру базы данных, который выполняет соответствующие операции». Источник: code.djangoproject.com/ticket/17741stable
, а неdev
ссылку на текущую версию Django, например: docs.djangoproject.com/en/stable/faq/models/…У Django-расширений есть команда shell_plus с параметром
print-sql
В django-shell все выполненные запросы будут напечатаны
Напр .:
источник
Посмотрите на debug_toolbar , он очень полезен для отладки.
Документация и источник доступны по адресу http://django-debug-toolbar.readthedocs.io/ .
источник
источник
m = MyModel.objects.get(...)
затемm.query
m
больше не набор запросов. Используйтеq = MyModel.objects.filter(...)
, тогдаq.query
, тогдаm = q.get()
.Ни один другой ответ не охватывает этот метод, поэтому:
Я считаю, что самый полезный, простой и надежный способ - спросить вашу базу данных. Например, в Linux для Postgres вы можете сделать:
У каждой базы данных будет немного другая процедура. В журналах базы данных вы увидите не только необработанный SQL, но и любые настройки соединения или накладные расходы на транзакции, которые django размещает в системе.
источник
log_statement='all'
вpostgresql.conf
течение этого метода.postgresql.conf
его, запустивpsql -U postgres -c 'SHOW config_file'
Хотя вы можете сделать это с помощью поставляемого кода, я считаю, что использование приложения панели инструментов отладки - отличный инструмент для отображения запросов. Вы можете скачать его с github здесь .
Это дает вам возможность показать все запросы, выполненные на данной странице, а также время, затраченное на запрос. Он также суммирует количество запросов на странице вместе с общим временем для быстрого просмотра. Это отличный инструмент, когда вы хотите посмотреть, что делает Django ORM за кулисами. Он также имеет много других приятных функций, которые вы можете использовать, если хотите.
источник
Другой вариант, см. Параметры ведения журнала в settings.py, описанном в этом посте.
http://dabapps.com/blog/logging-sql-queries-django-13/
debug_toolbar замедляет загрузку каждой страницы на вашем dev-сервере, ведение журнала - не так, это быстрее. Выходы могут быть выгружены в консоль или файл, поэтому пользовательский интерфейс не так хорош. Но для представлений с большим количеством SQL может потребоваться много времени для отладки и оптимизации SQL через debug_toolbar, так как загрузка каждой страницы очень медленная.
источник
Если вы убедитесь, что ваш файл settings.py имеет:
django.core.context_processors.debug
перечислены вCONTEXT_PROCESSORS
DEBUG=True
IP
вINTERNAL_IPS
кортежеТогда вы должны иметь доступ к
sql_queries
переменной. Я добавляю нижний колонтитул к каждой странице, которая выглядит следующим образом:Я получил переменную
sql_time_sum
, добавив строкук функции отладки в django_src / django / core / context_processors.py.
источник
Я разработал расширение для этой цели, чтобы вы могли легко добавить декоратор в вашу функцию просмотра и посмотреть, сколько запросов выполнено.
Установить:
Для использования в качестве диспетчера контекста:
Для использования в качестве декоратора:
Github: https://github.com/rabbit-aaron/django-print-sql
источник
Я считаю, что это должно работать, если вы используете PostgreSQL:
источник
Следующее возвращает запрос как действительный SQL, основанный на https://code.djangoproject.com/ticket/17741 :
источник
Я сделал небольшой фрагмент, который вы можете использовать:
Он принимает в качестве параметров функцию (содержит SQL-запросы) для проверки и аргументов, kwargs, необходимых для вызова этой функции. В результате он возвращает то, что возвращает функция, и печатает SQL-запросы в консоли.
источник
Я поместил эту функцию в файл утилит в одном из приложений в моем проекте:
Затем, когда это необходимо, я просто импортирую его и вызываю из любого необходимого контекста (обычно представления), например:
Это хорошо делать за пределами шаблона, потому что тогда, если у вас есть представления API (обычно Django Rest Framework), это применимо и там.
источник
Для Джанго 2.2:
Поскольку большинство ответов не очень помогли мне при использовании
./manage.py shell
. Наконец я нашел ответ. Надеюсь, это кому-нибудь поможет.Для просмотра всех запросов:
Чтобы просмотреть запрос для одного запроса:
q.query
просто отображение объекта для меня. С помощью__str__()
(String представление) отображается полный запрос.источник
Просмотр запросов с использованием django.db.connection.queries
Доступ к необработанному SQL-запросу к объекту QuerySet
источник
Просто добавьте, в django, если у вас есть запрос вроде:
делать:
получить строку sql
источник