Просмотр 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.
Вернуться на верх