Каждый бекендер желает знать, сколько запрос к СУБД

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

Описание проблемы

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

При разработке через TDD (Test-Driven Development) в legacy-проектах с большим количеством SQL-запросов часто возникает проблема: непонятно, откуда берутся запросы и где нужно оптимизировать код.

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

1. Использовать плагин django-debug-toolbar

    • Показывает место в коде где вызывается SQL запрос.
  • -- Нельзя использовать во время тестов, поэтому не подходит для разработки через TDD.

2. Использовать self.assertNumQueries(ОжидаемоеКоличествоЗапросов)

    • Можно использовать во время тестов, показывает, какие SQL запросы выполнялись.
    • Не показывает место в коде, где вызывается SQL запрос.

3. Компромисс TraceSQL

    • Можно использовать во время тестов.
    • Показывает место в коде, где вызывается SQL запрос.
    • Слишком подробный отчёт, который не особо нужен в тестах. Поэтому, когда вы уже оптимизировали SQL-запросы, используйте просто подсчёт количества выполняемых запросов через self.assertNumQueries.

Как указано выше, стандартный self.assertNumQueries не показывает место в коде, откуда вызваны SQL-запросы. Когда таких запросов более десяти, уже трудно понять, откуда они берутся, и приходится угадывать эти места. Поэтому я исследовал интернет, спросил у GPT и понял, что мало где написано про такой вариант.

Код и пример TraceSQL

TraceSQL.py

Заключение

Использование TraceSQL помогает более эффективно отслеживать и оптимизировать SQL-запросы в Django проекте. Этот инструмент является компромиссом между возможностями django-debug-toolbar и self.assertNumQueries, позволяя разработчикам легко определять места в коде, вызывающие лишние SQL-запросы.

#python #django

Каждый бекендер желает знать, сколько запрос к СУБД | Сетка — социальная сеть от hh.ru