gendesign/tradein-mvp/backend/data/sql/051_scrape_runs_extend.sql
lekss361 2914ff2ef2
All checks were successful
Deploy Trade-In / build-frontend (push) Successful in 23s
Deploy Trade-In / deploy (push) Successful in 22s
Deploy Trade-In / changes (push) Successful in 5s
Deploy Trade-In / build-backend (push) Successful in 38s
feat(tradein): city sweep — auto ЕКБ pipeline (#477)
Stage 4d: full city sweep ЕКБ (5 anchors × N pages + enrichment + cooperative cancel).

- avito.py fetch_around(pages=N) — pagination backward compat default=1
- scrape_pipeline.run_avito_city_sweep — anchors loop + heartbeat + cancel check
- scrape_runs.py utility (create/heartbeat/done/failed/cancelled/list_recent)
- admin.py 3 endpoints: start (BackgroundTasks) / runs / cancel
- migration 051 ADD COLUMN IF NOT EXISTS + DROP/ADD CHECK constraint (text+CHECK, не enum — safe в transaction)
- deploy/avito-city-sweep.sh с random delay 0-3h (anti-pattern)
- 16 offline tests

Deep review approved: migration idempotent, cancel priority correct (mark_done guarded by status='running'), no SQL injection, psycopg v3 compliant.
2026-05-23 14:38:07 +00:00

57 lines
3.1 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.

-- 051_scrape_runs_extend.sql
-- Расширение таблицы scrape_runs для поддержки city sweep pipeline:
-- - params jsonb — параметры запуска (radius_m, pages_per_anchor, …)
-- - counters jsonb — агрегированные счётчики (aggregate anchors_done, lots_fetched, …)
-- - error text — краткое сообщение об ошибке (alias для error_text)
-- - finished_at — время завершения run (done/failed/cancelled)
-- - 'cancelled' в status CHECK
--
-- Dependencies: 015_scrape_runs.sql
-- Идемпотентно: безопасно запускать повторно (ALTER ADD COLUMN IF NOT EXISTS).
BEGIN;
-- 1. Добавить params jsonb — конфигурация запуска
ALTER TABLE scrape_runs
ADD COLUMN IF NOT EXISTS params jsonb;
-- 2. Добавить counters jsonb — агрегированные счётчики (city sweep)
ALTER TABLE scrape_runs
ADD COLUMN IF NOT EXISTS counters jsonb;
-- 3. Добавить finished_at (было только в error_text / heartbeat_at)
ALTER TABLE scrape_runs
ADD COLUMN IF NOT EXISTS finished_at timestamptz;
-- 4. Добавить error text (alias для краткого сообщения, совместимо с scrape_runs utility module)
-- error_text уже существует (из 015) — добавляем error как синоним для новых runs.
-- Utility module пишет в 'error' — перенаправляем на error_text через generated column
-- НЕ работает в PostGIS/PG16 для text → используем просто второй столбец.
ALTER TABLE scrape_runs
ADD COLUMN IF NOT EXISTS error text;
-- 5. Расширить CHECK constraint status чтобы допускал 'cancelled'
-- DROP + ADD (нельзя ALTER CHECK в Postgres без пересоздания)
ALTER TABLE scrape_runs
DROP CONSTRAINT IF EXISTS scrape_runs_status_check;
ALTER TABLE scrape_runs
ADD CONSTRAINT scrape_runs_status_check
CHECK (status IN ('running', 'done', 'failed', 'zombie', 'skipped', 'banned', 'cancelled'));
-- 6. run_type имеет NOT NULL в 015 — для city sweep run_type = 'city_sweep'
-- Убедимся что INSERT в scrape_runs.py покрывает это через DEFAULT
ALTER TABLE scrape_runs
ALTER COLUMN run_type SET DEFAULT 'city_sweep';
COMMENT ON COLUMN scrape_runs.params IS
'JSON-параметры запуска pipeline (pages_per_anchor, radius_m, detail_top_n, …)';
COMMENT ON COLUMN scrape_runs.counters IS
'JSON-счётчики прогресса (anchors_done, lots_fetched, houses_enriched, …). '
'Обновляется heartbeat''ом каждый anchor.';
COMMENT ON COLUMN scrape_runs.finished_at IS
'Время завершения run (status=done/failed/cancelled).';
COMMENT ON COLUMN scrape_runs.error IS
'Краткое сообщение об ошибке (для status=failed). Первые 1000 символов.';
COMMIT;