Логи SQL
Расскажу один прием, полезный в разработке.
Если я работаю с PostgreSQL, то включаю логирование всех выражений. В Докере это
делается передачей параметра -E
как в примере ниже:
version: "3.6"
services:
postgres:
image: postgres:14
command: -E
С ним все запросы видны в терминале, где запущен Докер.
Если база работает нативно, в файлик postgresql.conf
добавляю выражение:
log_statement = 'all'
Оно там есть из коробки, но закомментировано. В отдельной вкладке вызываю вечный tail
:
> tail -f '/path/to/postgresql.log'
Далее я пишу код, гоняю тесты и посматриваю логи. Зачем? Потому что за много лет я выявил столько чуши, что просто не описать. Например:
-
запросы
WHERE ID IN
на тысячи айдишников; -
группировка по всем(!) полям таблицы:
GROUP BY id, name, email, etc...
; -
молчаливый откат транзакции без выброса исключения. Запрос упал, но разработчик молча идет дальше;
-
изменения без транзакции там, где она должна быть;
-
мусорные запросы в
pg_catalog
и другие служебные таблицы, потому что какие-то свойства не заданы в коде; -
чтение записей поштучно по ID в цикле (200, 500 шагов и больше);
-
просто всякие дикие конструкции.
Все это я собираю и открывают тикеты. Некоторые даже удается исправить.
Лог базы — своего рода осиное гнездо. Открой его — и почти наверняка уйдешь в ступор от того, какую дичь генерит ORM или “умная” библиотека. Или разработчик, вооруженный всем этим добром.
Так и живем.
Нашли ошибку? Выделите мышкой и нажмите Ctrl/⌘+Enter
Полярный, 1st Jun 2023, link
Вещь полезная, добавлю в копилочку. Спасибо.