chore(tradein/db): DROP listings_snapshots.position_in_serp — шаг 2 из 2 (#2697) #2728

Merged
bot-backend merged 1 commit from chore/2697-drop-position-in-serp into main 2026-08-06 11:41:40 +00:00
Collaborator

Summary

Шаг 2 из 2 к #2674: сама ALTER TABLE listings_snapshots DROP COLUMN IF EXISTS position_in_serp. Один файл data/sql/227_drop_position_in_serp.sql, идемпотентно.

Предусловие — чем именно проверено (2026-08-06)

Окно, из-за которого DROP откладывали (SQL применяется ДО перезапуска контейнеров → живой старый образ ещё INSERT'ит удалённую колонку, а запись снимков глотает свои ошибки), закрыто: правка писателя из #2694 уже на проде. Проверено фактом, а не рассуждением — по коду в живых контейнерах:

docker exec tradein-scraper|tradein-backend grep -rn position_in_serp /app --include=*.py --include=*.sql --include=*.ts
→ ровно 4 строки, все — docstring snapshot_writer.py (18/34/37/76); ни одного SQL
docker exec ... python -c "inspect.signature(m.upsert_listing_snapshot)" → параметра нет
docker exec ... python -c "'position_in_serp' in d._STALE_SNAPSHOT_TAIL" → False

Оба живых писателя listings_snapshots перечисляют колонки явно и этой в списке не имеют: scraper_kit/snapshot_writer.py::upsert_listing_snapshot (весь скрейп-путь) и app/tasks/deactivate_stale_avito.py::_STALE_SNAPSHOT_TAIL (TTL-снимки stale).

Читателей нет

  • прод: count(position_in_serp) = 0 из 397 217 строк;
  • 0 зависимых view/matview (pg_dependpg_rewrite по этому attnum), ни индексов, ни триггеров;
  • foreign table над listings_snapshots не существует (FDW-обёртки — только над gendesign-таблицами), в information_schema.columns имя встречается ровно в одной таблице;
  • код: ни одного SELECT-читателя (SELECT * по таблице нигде нет), фронт / экспортёры / админка колонку не упоминают. Сторож tests/test_snapshot_writer.py проверяет отсутствие колонки у писателя и после DROP остаётся валиден.

Test plan

  • tests/test_migrations_manifest.py + tests/test_snapshot_writer.py — 22 passed (префикс 227 уникален; manifest содержит только уже применённые на проде имена, 217-224 в нём тоже нет — новую строку не добавляю).
  • Прод после деплоя: колонки нет в information_schema.columns, а запись снимков продолжает работать — следующий avito_city_sweep / ночной listing_source_snapshot пишут строки.

Closes #2697

## Summary Шаг 2 из 2 к #2674: сама `ALTER TABLE listings_snapshots DROP COLUMN IF EXISTS position_in_serp`. Один файл `data/sql/227_drop_position_in_serp.sql`, идемпотентно. ## Предусловие — чем именно проверено (2026-08-06) Окно, из-за которого DROP откладывали (SQL применяется ДО перезапуска контейнеров → живой старый образ ещё INSERT'ит удалённую колонку, а запись снимков глотает свои ошибки), закрыто: правка писателя из #2694 уже на проде. Проверено фактом, а не рассуждением — **по коду в живых контейнерах**: ``` docker exec tradein-scraper|tradein-backend grep -rn position_in_serp /app --include=*.py --include=*.sql --include=*.ts → ровно 4 строки, все — docstring snapshot_writer.py (18/34/37/76); ни одного SQL docker exec ... python -c "inspect.signature(m.upsert_listing_snapshot)" → параметра нет docker exec ... python -c "'position_in_serp' in d._STALE_SNAPSHOT_TAIL" → False ``` Оба живых писателя `listings_snapshots` перечисляют колонки явно и этой в списке не имеют: `scraper_kit/snapshot_writer.py::upsert_listing_snapshot` (весь скрейп-путь) и `app/tasks/deactivate_stale_avito.py::_STALE_SNAPSHOT_TAIL` (TTL-снимки `stale`). ## Читателей нет - прод: `count(position_in_serp) = 0` из 397 217 строк; - 0 зависимых view/matview (`pg_depend` → `pg_rewrite` по этому attnum), ни индексов, ни триггеров; - foreign table над `listings_snapshots` не существует (FDW-обёртки — только над gendesign-таблицами), в `information_schema.columns` имя встречается ровно в одной таблице; - код: ни одного SELECT-читателя (`SELECT *` по таблице нигде нет), фронт / экспортёры / админка колонку не упоминают. Сторож `tests/test_snapshot_writer.py` проверяет отсутствие колонки у писателя и после DROP остаётся валиден. ## Test plan - [x] `tests/test_migrations_manifest.py` + `tests/test_snapshot_writer.py` — 22 passed (префикс 227 уникален; manifest содержит только уже применённые на проде имена, 217-224 в нём тоже нет — новую строку не добавляю). - [ ] Прод после деплоя: колонки нет в `information_schema.columns`, а запись снимков продолжает работать — следующий `avito_city_sweep` / ночной `listing_source_snapshot` пишут строки. Closes #2697
bot-backend added 1 commit 2026-08-06 11:21:45 +00:00
chore(tradein/db): DROP listings_snapshots.position_in_serp — шаг 2 из 2 (#2697)
All checks were successful
CI / changes (pull_request) Successful in 10s
CI Trade-In / changes (pull_request) Successful in 10s
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Successful in 3m13s
d4c5cb84c4
Колонка признана невыразимой в этой таблице (#2674, диагноз в миграции 217): позиция
есть свойство пары «объявление × конкретный прогон выдачи с конкретными фильтрами», а
PRIMARY KEY (listing_id, snapshot_date) держит одну строку на объявление в сутки —
за 2026-08-03 по этому ключу писали 13 разных run_id и четыре SERP-источника.

Шаг 1 (правка писателя) уже на проде, поэтому окна «SQL применяется до перезапуска
контейнеров» больше нет. Предусловие проверено по коду В КОНТЕЙНЕРАХ, а не по зелёному
деплою: grep по /app в tradein-scraper и tradein-backend находит имя колонки ровно в
четырёх строках docstring'а snapshot_writer.py и ни в одном SQL; сигнатура
upsert_listing_snapshot колонку не содержит; второй писатель
(deactivate_stale_avito._STALE_SNAPSHOT_TAIL) перечисляет колонки явно и этой в списке
не имеет.

Читателей нет: 0 непустых значений из 397 217 строк на проде, 0 зависимых view/matview
(pg_depend → pg_rewrite), ни индексов, ни триггеров, ни foreign table над таблицей;
в коде нет ни одного SELECT-читателя (SELECT * по таблице отсутствует), фронт,
экспортёры и админка колонку не упоминают.

Refs #2697
bot-backend merged commit 2a1577738a into main 2026-08-06 11:41:40 +00:00
bot-backend deleted branch chore/2697-drop-position-in-serp 2026-08-06 11:41:40 +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#2728
No description provided.