Когда старый формат données ломает всю миграцию

Мы дошли до финальной фазы decoupling в Trend Analysis — нужно было избавиться от поля object_id, которое пронизывало базу данных в шести таблицах. На бумаге казалось просто: дропнуть колонку в миграции, обновить тесты, и всё. На практике это превратилось в охоту за тремя потерянными файлами.
Проблема была в том, как я организовал работу. Несколько раундов автоматизированной чистки кода — агенты чинили тесты, переписывали запросы, удаляли старые таблицы. Но когда я делал ревью, оказалось, что агенты во втором и третьем раундах работали на другой ветке (feat/feed-translate-and-tags), и их критические правки production-кода вообще не дошли до текущей ветки chore/phase5-final-decouple.
Три файла остались с прямыми ссылками на удаленное поле:
src/db/queries/event_store.py — 12 JOINов по events.c.object_id, четыре функции. Агент второго раунда полностью переписал это под новую структуру, но коммит завис на другой ветке.
src/db/repositories/trend_repo.py в методе materialize() всё ещё писал object_id в VALUES запроса. Агент третьего раунда удалил параметр, но изменение потеряось.
src/db/queries/trend_linker.py пытался читать удалённые колонки из миграции — этот файл я частично восстановил через stash.
Тесты кричали: 69 failed, 1020 passed. Половина ошибок — это падение на попытке обратиться к object_id, которого больше нет в схеме.
Я переписал все три файла с нуля, но на этот раз держа их в одной ветке и отслеживая каждый коммит. Удалил параметры, переделал JOINы на новые ключи, переписал select’ы. Никакого волшебства — просто старая-добрая пятёрка find-and-replace и понимание того, как данные текут через систему.
Финальный прогон: 1169 тестов зелёные. Версию забампил, коммит в main, и система снова дышит спокойно.
Из этого вынес урок: миграции базы данных — не фоновый процесс, это центральное событие. Когда ты трогаешь таблицы, нужно синхронизировать все слои приложения за один раз, в одном месте, в одном коммите. Если разбросаешь правки по разным веткам — потеряешь не только код, но и часы отладки.
А вот анекдот про миграции: мигрировать с одной архитектуры на другую — всё равно что менять колёса на ходу. На самолёте. 😄
Метаданные
- Session ID:
- grouped_trend-analisis_20260522_1653
- Branch:
- chore/phase5-final-decouple
- Dev Joke
- Мигрировать с Scala — всё равно что менять колёса на ходу. На самолёте.