fix(tradein): implement listings_snapshots + offer_price_history writers (#567) #624

Merged
Light1YT merged 2 commits from fix/567-cian-history-writers into main 2026-05-28 13:49:53 +00:00

2 commits

Author SHA1 Message Date
5794009840 fix(tradein): SAVEPOINT-wrap cian snapshot write + harden log (#567) 2026-05-28 18:43:58 +05:00
b16935e679 fix(tradein): реализовать writers listings_snapshots/offer_price_history (#567)
listings_snapshots не имел ни одного writer'а — таблица оставалась пустой.
offer_price_history уже писался в save_detail_enrichment, но ON CONFLICT DO NOTHING
не указывал имя constraint'а (добавлено в 047_cian_history_sanitize.sql), что делало
де-дупликацию неэффективной.

Добавлено:
- snapshot_writer.py: upsert_listing_snapshot() — атомарный INSERT ... ON CONFLICT
  DO UPDATE на (listing_id, snapshot_date), без commit (commit у caller'а).
- base.py save_listings(): вызывает upsert_listing_snapshot после каждого INSERT/UPDATE
  listings; принимает опциональный run_id; ошибка snapshot не прерывает батч.
- cian_detail.py save_detail_enrichment(): SELECT price_rub/price_per_m2 из listings,
  затем upsert_listing_snapshot; ON CONFLICT для offer_price_history теперь ссылается
  на offer_price_history_listing_change_uq (именованный constraint из мигр. 047).
- test_snapshot_writer.py: 17 unit-тестов покрывают SQL-форму, params, идемпотентность,
  интеграцию с save_listings и save_detail_enrichment, fault-tolerance.
2026-05-28 18:26:52 +05:00