Класс «площадка прислала, парсер разобрал, до базы не доехало». Правка #2682
починила ПУТЬ (парсер отдаёт imageLink, INSERT его перечисляет), но только для
будущих строк — исторические так и остались с NULL.
Прод 2026-08-06, точные count(*):
house_suggestions 25 055 строк, image_link заполнен у 0
house_imv_evaluations 2 685 строк, raw_response есть у 2 685,
suggestions.items[0].imageLink есть у 2 685
Сырьё сохранено целиком, поэтому исторические ВОССТАНОВИМЫ: ключ подсказки
(house_id, ext_item_id) однозначно ложится на (e.house_id, item->>'id').
SELECT-прогон того же JOIN на проде: 21 480 из 25 055 (85.7%) восстановимо.
Остальные 3 575 невосстановимы в принципе, и это не недоделанный бэкфилл:
house_imv_evaluations имеет UNIQUE(house_id) и ON CONFLICT DO UPDATE, поэтому
повторная оценка дома перетирает raw_response — старый набор подсказок остаётся
без своего сырья. Пишу это в комментарий к колонке, чтобы следующий читатель
не искал баг в разнице 25 055 vs 21 480.
Идемпотентно: WHERE image_link IS NULL — повтор не трогает заполненное и не
перетирает то, что напишет живой скрейпер.