Просмотр SQL запросов Django

Django ORM позволяет легко взаимодействовать с базой данных. Чтобы понять, что происходит за кулисами или увидеть производительность SQL, мы можем записать все запросы SQL, которые выполняются. В этой статье мы увидим различные способы достижения этого.

Использование django-debug-toolbar

Панель инструментов отладки Django предоставляет интерфейс для отображения отладочной информации о запросах: все выполненные запросы SQL и время, затраченное на них.

При создании REST API или микросервисов, в которых не используется движок шаблонов Django, этот метод не будет работать. В этих ситуациях мы должны выводить запросы SQL в консоль.

Использование django-extensions

Django-extensions предоставляет множество утилит для продуктивной разработки. Для команд runserver_plus и shell_plus он принимает и необязательный аргумент --print-sql, который печатает все выполняемые SQL-запросы.

./manage.py runserver_plus --print-sql
./manage.py shell_plus --print-sql

Всякий раз, когда выполняется SQL-запрос, он печатает запрос и время, затраченное на него, в консоли.

In [42]: User.objects.filter(is_staff=True)
Out[42]: SELECT "auth_user"."id",
       "auth_user"."password",
       "auth_user"."last_login",
       "auth_user"."is_superuser",
       "auth_user"."username",
       "auth_user"."first_name",
       "auth_user"."last_name",
       "auth_user"."email",
       "auth_user"."is_staff",
       "auth_user"."is_active",
       "auth_user"."date_joined"
  FROM "auth_user"
 WHERE "auth_user"."is_staff" = true
 LIMIT 21


Execution time: 0.002107s [Database: default]

<QuerySet [<User: anand>, <User: chillar>]>

Использование django-querycount

Django-querycount предоставляет промежуточное ПО (узнайте о новом формате middleware в Django 2) для отображения количества запросов SQL и отображения дубликатов запросов на консоли.

|------|-----------|----------|----------|----------|------------|
| Type | Database  |   Reads  |  Writes  |  Totals  | Duplicates |
|------|-----------|----------|----------|----------|------------|
| RESP |  default  |    3     |    0     |    3     |     1      |
|------|-----------|----------|----------|----------|------------|
Total queries: 3 in 1.7738s


Repeated 1 times.
SELECT "django_session"."session_key",
"django_session"."session_data", "django_session"."expire_date" FROM
"django_session" WHERE ("django_session"."session_key" =
'dummy_key AND "django_session"."expire_date"
> '2018-05-31T09:38:56.369469+00:00'::timestamptz)

Этот пакет предоставляет дополнительные параметры для настройки вывода.

Django logging

Вместо использования какого-либо стороннего пакета, мы можем использовать логгер для django.db.backends для печати всех SQL-запросов.

Добавьте django.db.backends в список регистраторов и установите уровень сообщений и обработчики.

'loggers': {
        'django.db.backends': {
            'level': 'DEBUG',
            'handlers': ['console', ],
        },

В консоли runserver мы видим все запросы SQL, которые выполняются.

(0.001) SELECT "django_admin_log"."id", "django_admin_log"."action_time", "django_admin_log"."user_id", "django_admin_log"."content_type_id", "django_admin_log"."object_id", "django_admin_log"."object_repr", "django_admin_log"."action_flag", "django_admin_log"."change_message", "auth_user"."id", "auth_user"."password", "auth_user"."last_login", "auth_user"."is_superuser", "auth_user"."username", "auth_user"."first_name", "auth_user"."last_name", "auth_user"."email", "auth_user"."is_staff", "auth_user"."is_active", "auth_user"."date_joined", "django_content_type"."id", "django_content_type"."app_label", "django_content_type"."model" FROM "django_admin_log" INNER JOIN "auth_user" ON ("django_admin_log"."user_id" = "auth_user"."id") LEFT OUTER JOIN "django_content_type" ON ("django_admin_log"."content_type_id" = "django_content_type"."id") WHERE "django_admin_log"."user_id" = 4 ORDER BY "django_admin_log"."action_time" DESC LIMIT 10; args=(4,)
[2018/06/03 15:06:59] HTTP GET /admin/ 200 [1.69, 127.0.0.1:47734]

Это несколько способов записать все запросы SQL на консоль. Мы также можем написать собственное специальное промежуточное программное обеспечение (middleware) для лучшей регистрации этих запросов и получения дополнительной информации.

Также посмотрите совет про поиск узких мест производительности проекта на Django.

Поделитесь с другими:

Представления-классы
(Class-Based Views)

Детальное описание и структура классов Django.

Исправление ошибок, Django 2.1.8

Выпущена новая версия Django 2.1.8, в которой исправлена ошибка в админке, допущенная в версии 2.1.7: запрещено редактировать inline-элементы для ManyToManyField, если у пользователя есть только разрешение на просмотр.

Аутентификация в Django: полный пример входа, выхода и смены пароля

В этом руководстве вы узнаете, как легко добавить полноценную систему аутентификации приложение Django с функциями входа в систему, выхода из системы, смены пароля и сброса.

Django 2.2 предварительный выпуск 1

Выпущен релиз-кандидат 1 версии Django 2.2, в котором вы можете предварительно протестировать некоторые новые возможности перед выпуском Django 2.2.

Поиск узких мест производительности проекта на Django

При оптимизации производительности веб-приложения распространенная ошибка — начинать с оптимизации самой медленной страницы (или API). Помимо учета времени отклика, мы также должны учитывать трафик, который он получает, чтобы определить порядок оптимизации. В этой статье мы расскажем о веб-приложении Django, найдем узкие места с высокой эффективностью, а затем приступим к их оптимизации для повышения производительности.

Просмотр SQL запросов Django

Django ORM позволяет легко взаимодействовать с базой данных. Чтобы понять, что происходит за кулисами или увидеть производительность SQL, мы можем записать все запросы SQL, которые выполняются. В этой статье мы увидим различные способы достижения этого.

Как подключить виджет выбора даты в Django

Из этого руководства вы узнаете как легко подключить виджет выбора даты в своем проекте Django. Мы узнаем, как установить его вручную, потом как настроить пользовательский виджет и, наконец, как использовать стороннее приложение Django с поддержкой средств выбора даты и времени.

Исправление ошибок, Django 2.0.13

Сегодня был осуществлен новый выпуск исправлений Django 2.0.13. Исправлен сбой в django.utils.numberformat.format_number(), когда число имеет более 200 цифр (#30177).

Новый формат middleware в Django 2

MIddleware (промежуточный слой) используются для модификации объекта приходящего запроса в представление (view) или для модификации объекта ответа, возвращаемого из представления. Они позволяют нам изменять запросы/ответы глобально.

Массовое обновление записей в Django используя аннотации и подзапросы

Как массово обновлять записи в Django с помощью аннотаций и подзапросов.

Структура шаблонов в Django

Существует два основных способа организации структуры шаблонов Django: на уровне приложений и пользовательский, на уровне проекта, который указывается в setting.py.