feat(etl): read tradein data via market.v_* contract views (#2138 step 2/3) #2148

Merged
lekss361 merged 1 commit from feat/etl-crossload-market-views into main 2026-07-02 15:00:39 +00:00
Owner

Часть #2138 (Epic #2127), шаг 2/3 трека J. Переключает cross-load ETL на чтение contract-view вместо сырых таблиц. Гейт (шаг 1, GRANT #2147/миграция 155) уже на проде — gendesign_reader читает все 5 market.v_* (QA подтвердил).

Механизм чтения tradein (выяснено)

Прямой psycopg v3 connect к tradein-postgres по settings.tradein_database_url под ролью gendesign_reader (server-side cursor, батчи 500 → UPSERT в локальную newbuilding_listings). НЕ FDW, foreign table нет → миграция на gendesign-стороне не нужна, переключение = смена схемы в FROM/JOIN.

Что переключено

В newbuilding_crossload.py _SOURCE_SQL (единственное место, читающее tradein):

  • FROM houses hFROM market.v_houses h
  • LEFT JOIN house_sourcesLEFT JOIN market.v_house_sources

Идентичность данных

Все читаемые ETL колонки присутствуют в v_* (сверено с 154). View = SELECT <явные колонки> FROM public.<table> без WHERE/агрегатов → строки и семантика идентичны. premises_lookup/competitors tradein не читают (не тронуты).

Verify

  • pytest tests/services/test_newbuilding_crossload.py → 11 passed
  • ruff clean

⚠️ После мержа

ETL — Celery beat (03:30 МСК), моментально не падает. Грант 155 уже на проде (гейт пройден), так что следующий прогон читает v_* успешно. REVOKE сырых = шаг 3/3, поедет только после подтверждения что ETL реально отработал через view.

Часть #2138 (Epic #2127), **шаг 2/3** трека J. Переключает cross-load ETL на чтение contract-view вместо сырых таблиц. Гейт (шаг 1, GRANT #2147/миграция 155) уже на проде — `gendesign_reader` читает все 5 `market.v_*` (QA подтвердил). ## Механизм чтения tradein (выяснено) Прямой **psycopg v3 connect** к tradein-postgres по `settings.tradein_database_url` под ролью `gendesign_reader` (server-side cursor, батчи 500 → UPSERT в локальную `newbuilding_listings`). **НЕ FDW**, foreign table нет → миграция на gendesign-стороне не нужна, переключение = смена схемы в `FROM/JOIN`. ## Что переключено В `newbuilding_crossload.py` `_SOURCE_SQL` (единственное место, читающее tradein): - `FROM houses h` → `FROM market.v_houses h` - `LEFT JOIN house_sources` → `LEFT JOIN market.v_house_sources` ## Идентичность данных Все читаемые ETL колонки присутствуют в v_* (сверено с 154). View = `SELECT <явные колонки> FROM public.<table>` без WHERE/агрегатов → строки и семантика идентичны. `premises_lookup`/`competitors` tradein не читают (не тронуты). ## Verify - `pytest tests/services/test_newbuilding_crossload.py` → 11 passed - ruff clean ## ⚠️ После мержа ETL — Celery beat (03:30 МСК), моментально не падает. Грант 155 уже на проде (гейт пройден), так что следующий прогон читает v_* успешно. REVOKE сырых = шаг 3/3, поедет только после подтверждения что ETL реально отработал через view.
lekss361 added 1 commit 2026-07-02 15:00:27 +00:00
feat(etl): read tradein data via market.v_* contract views (#2138 step 2/3)
All checks were successful
CI / changes (pull_request) Successful in 7s
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Successful in 2m28s
CI / backend-tests (pull_request) Successful in 14m31s
8451791c64
lekss361 merged commit 1c184959a8 into main 2026-07-02 15:00:39 +00:00
lekss361 deleted branch feat/etl-crossload-market-views 2026-07-02 15:00:39 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#2148
No description provided.