Как просмотреть SQL-запросы Django в режиме отладки

Пройдите тест, узнайте какой профессии подходите и получите бесплатную карьерную консультацию
В конце подарим скидку до 55% на обучение
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для отслеживания SQL-запросов, выполняемых Django, воспользуйтесь connection.queries. Проверьте, что в настройках DEBUG значение установлено на True.

Python
Скопировать код
from django.db import connection

# Здесь выполняется ваш запрос...

print(connection.queries)  # Выводятся SQL-запросы в их первозданном виде!

Примечание: Используйте это только при отладке кода. В случае постоянной работы это может привести к снижению производительности.

Погружение

Вглядывание в будущее SQL-запроса с помощью атрибута .query

QuerySets ORM Django дает возможность просмотра не выполненного SQL-запроса через атрибута .query:

Python
Скопировать код
my_queryset = MyModel.objects.all()
print(my_queryset.query)  # Просмотр ожидаемого SQL-запроса

Отладка при помощи Django Debug Toolbar

Django Debug Toolbar предоставляет весьма удобные инструменты для просмотра SQL-запросов, указывающие также время их выполнения. Это помогает улучшить работу с базой данных.

shell
Скопировать код
pip install django-debug-toolbar

После установки добавьте его в список INSTALLED_APPS и в middleware.

Очищение истории запросов с помощью reset_queries

Чтобы предотвратить накапливание данных о прошлых запросах, можно использовать reset_queries, чтобы очистить их историю:

Python
Скопировать код
from django.db import reset_queries

reset_queries()
# Здесь выполняются новые запросы
print(connection.queries)  # Выводятся данные только о новых запросах

Просмотр логов базы данных в реальном времени

Для мониторинга в реальном времени:

  • В Linux используйте tail -f, чтобы отслеживать логи базы данных в реальном времени.
  • Наблюдайте за взаимодействием вашего приложения с базой данных.

Акцент на безопасность: остерегайтесь использования print() на production

Будьте аккуратны при использовании вывода SQL-запросов на production, это может стать причиной уязвимостей.

django-extensions для отслеживания ORM-запросов

С использованием инструмента shell_plus и опции print-sql из django-extensions можно следить за преобразованием ORM-запросов в SQL:

shell
Скопировать код
python manage.py shell_plus --print-sql

Визуализация

В работе Django ORM происходит что-то вроде исполнения музыки бессмысленным оркестром за скрытыми от нас декорациями:

Markdown
Скопировать код
Django ORM 🎨: Организует процесс, не видя «ноты», которые используют музыканты.

Чтобы упорядочить происходящее, воспользуйтесь:

Python
Скопировать код
from django.db import connection
print(connection.queries)

Открываем занавес…

Markdown
Скопировать код
Занавес (🎭)  |  Симфония (🎼)
-------------|-----------------
🖼️ ORM-код    |  SELECT * FROM ...
🖼️ QuerySet   |  INSERT INTO ...

Таким образом, музыка SQL, которую дирижирует Django ORM, становится наглядной.

Продвинутые усовершенствования

Изучение SQL для оптимизации производительности

Анализ SQL-запросов помогает более точно подобрать параметры производительности приложения.

Аккуратность при выводе информации в production

Контролируйте вывод запросов в production, чтобы минимизировать наличие проблем с логами.

Использование возможностей баз данных

В каждой БД есть уникальные инструменты, например, pg_stat_statements в PostgreSQL, помогающие оптимизировать запросы.

Понимание деталей для достижения эффективности

Учет времени запросов и анализ статистики БД помогут оптимизировать её работу.

Полезные материалы

  1. Django Debug Toolbar — визуальное руководство по SQL
  2. Изучение исходных SQL-запросов в Django
  3. Настройка логирования SQL в Django
  4. Обсуждение на Stack Overflow: исходные SQL-запросы в Django
  5. Эффективное использование ORM и QuerySets в Django
  6. Выполнение "сырых" SQL-запросов при помощи Django
  7. Оптимизация работы с базой данных через Django