gendesign/tradein-mvp/backend/data/sql/227_drop_position_in_serp.sql
bot-backend d4c5cb84c4
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
chore(tradein/db): DROP listings_snapshots.position_in_serp — шаг 2 из 2 (#2697)
Колонка признана невыразимой в этой таблице (#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
2026-08-06 16:21:17 +05:00

41 lines
3.8 KiB
PL/PgSQL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- 227_drop_position_in_serp.sql
-- listings_snapshots.position_in_serp — DROP, шаг 2 из 2 (#2697, продолжение #2674).
--
-- Dependencies: 217_position_in_serp_unexpressible.sql (диагноз + COMMENT на колонке).
-- Apply after: 224_houses_house_type_canon.sql
-- Идемпотентно: DROP COLUMN IF EXISTS.
--
-- ── ПОЧЕМУ УДАЛЯЕМ, А НЕ ПОДКЛЮЧАЕМ ──────────────────────────────────────────
-- Полный разбор — в 217. Кратко: позиция есть свойство пары (объявление, конкретный
-- прогон выдачи с конкретными фильтрами), а PRIMARY KEY (listing_id, snapshot_date)
-- держит одну строку на объявление в сутки — при том что за 2026-08-03 по этому ключу
-- писали 13 разных run_id и четыре SERP-источника, а внутри одного city_sweep
-- объявление приезжает с разным индексом от перекрывающихся гео-якорей. Значение
-- оседало бы от последнего писателя дня и читалось бы как факт. Честное хранение —
-- отдельная таблица с ключом (run_id, listing_id) и сохранёнными фильтрами прогона,
-- то есть НЕ возврат этой колонки.
--
-- ── ПРЕДУСЛОВИЕ ПРОВЕРЕНО ПЕРЕД МЕРЖЕМ (2026-08-06) ──────────────────────────
-- Окно «SQL применяется ДО перезапуска контейнеров» закрыто тем, что правка кода
-- (#2694) уже живёт на проде — проверено ПО КОДУ В КОНТЕЙНЕРАХ, не по зелёному
-- деплою: grep по /app в tradein-scraper и tradein-backend находит имя колонки
-- ровно в четырёх строках docstring'а snapshot_writer.py (18/34/37/76) и ни в одном
-- SQL; inspect.signature(upsert_listing_snapshot) колонку не содержит.
-- Оба живых писателя перечисляют колонки явно и этой в списке не имеют:
-- * scraper_kit/snapshot_writer.py::upsert_listing_snapshot (весь скрейп-путь),
-- * app/tasks/deactivate_stale_avito.py::_STALE_SNAPSHOT_TAIL (TTL-снимки 'stale').
--
-- ── ЧИТАТЕЛЕЙ НЕТ ────────────────────────────────────────────────────────────
-- На проде: 0 непустых значений из 397 217 строк; 0 view/matview зависят от колонки
-- (pg_depend → pg_rewrite); индексов и триггеров на ней нет; foreign table над
-- listings_snapshots не существует (FDW-обёртки только над gendesign-таблицами);
-- в information_schema.columns имя встречается ровно в этой таблице. В коде: ни
-- одного SELECT-читателя (`SELECT *` по таблице нигде нет), фронт/экспортёры/админка
-- колонку не упоминают. Единственный сторож — tests/test_snapshot_writer.py, он
-- проверяет отсутствие колонки у писателя и после DROP остаётся валиден.
BEGIN;
ALTER TABLE listings_snapshots DROP COLUMN IF EXISTS position_in_serp;
COMMIT;