Просмотр 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.

Вернуться на верх