From 7b84e4d2a50ed3649a392e46ad9423aeaccc2366 Mon Sep 17 00:00:00 2001 From: bot-backend Date: Sat, 12 Sep 2026 00:27:09 +0300 Subject: [PATCH] =?UTF-8?q?fix(msk):=20=D0=BC=D0=B8=D0=B3=D1=80=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D1=8F=20299=20=D0=B7=D0=B0=D0=B2=D0=BE=D0=B4=D0=B8?= =?UTF-8?q?=D1=82=20=D1=81=D1=85=D0=B5=D0=BC=D1=83=20msk=5Fraw=20=D1=81?= =?UTF-8?q?=D0=B0=D0=BC=D0=B0,=20=D0=B0=20=D0=BD=D0=B5=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=BB=D0=B0=D0=B3=D0=B0=D0=B5=D1=82=D1=81=D1=8F=20=D0=BD=D0=B0?= =?UTF-8?q?=20=D0=BF=D1=80=D0=BE=D0=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CI Trade-In падал до единого теста: «schema "msk_raw" does not exist», job backend-tests, run 10854. Схему и первые две таблицы (`batches`, `avito_cards`) заводили на проде руками 08.09 — сбор сырья стартовал раньше модели данных, и msk_raw сознательно жила вне линейки миграций. На чистой базе CI этого контекста нет, а 299 сразу создаёт таблицы внутри схемы и вешает внешний ключ на `msk_raw.batches`. DDL продовских объектов повторён в 299 идемпотентно, определения сняты `pg_dump -s -n msk_raw`, чтобы CI и прод не разъехались молча. На проде это no-op. Проверено на пустой базе migtest_msk: применяется с ON_ERROR_STOP=1, даёт все пять таблиц и четыре вью, повторное применение проходит без ошибок. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01VQ8jqr4SFirX5tFLwdSrXh --- ...299_msk_raw_cian_domclick_yandex_cards.sql | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/tradein-mvp/backend/data/sql/299_msk_raw_cian_domclick_yandex_cards.sql b/tradein-mvp/backend/data/sql/299_msk_raw_cian_domclick_yandex_cards.sql index e0860579..d2b0f160 100644 --- a/tradein-mvp/backend/data/sql/299_msk_raw_cian_domclick_yandex_cards.sql +++ b/tradein-mvp/backend/data/sql/299_msk_raw_cian_domclick_yandex_cards.sql @@ -34,6 +34,53 @@ BEGIN; +-- Схема и две первые таблицы заводились на проде РУКАМИ 08.09, мимо линейки +-- миграций: сбор сырья стартовал раньше, чем модель данных, и msk_raw сознательно +-- жила вне приложения (её никто в проде не читает, переезжает одним +-- `pg_dump -n msk_raw`). Из-за этого миграция роняла CI на чистой базе — +-- «schema "msk_raw" does not exist», а до тестов дело не доходило вовсе. +-- +-- Поэтому DDL продовских объектов повторён здесь идемпотентно: на проде это +-- no-op (всё уже есть), на чистой базе — единственное место, где msk_raw +-- появляется. Определения сняты с прода `pg_dump -s -n msk_raw`, чтобы CI и +-- прод не разъехались молча; `batches` нужна и по существу — на неё ссылается +-- внешний ключ всех трёх таблиц ниже. +CREATE SCHEMA IF NOT EXISTS msk_raw; + +CREATE TABLE IF NOT EXISTS msk_raw.batches ( + batch_id text PRIMARY KEY, + kind text NOT NULL DEFAULT 'serp', + query text, + started_at timestamptz, + finished_at timestamptz, + rows_sent integer, + rows_new integer, + notes text, + uploaded_at timestamptz NOT NULL DEFAULT NOW() +); + +CREATE TABLE IF NOT EXISTS msk_raw.avito_cards ( + id bigserial PRIMARY KEY, + source_id bigint NOT NULL, + observed_at timestamptz NOT NULL, + batch_id text NOT NULL REFERENCES msk_raw.batches(batch_id), + kind text NOT NULL DEFAULT 'serp', + url text, + price numeric, + payload jsonb NOT NULL, + UNIQUE (source_id, batch_id, kind) +); +CREATE INDEX IF NOT EXISTS avito_cards_observed_idx + ON msk_raw.avito_cards (observed_at); +CREATE INDEX IF NOT EXISTS avito_cards_payload_gin + ON msk_raw.avito_cards USING gin (payload jsonb_path_ops); +CREATE INDEX IF NOT EXISTS avito_cards_source_observed_idx + ON msk_raw.avito_cards (source_id, observed_at DESC); + +CREATE OR REPLACE VIEW msk_raw.avito_latest AS +SELECT DISTINCT ON (source_id) id, source_id, observed_at, batch_id, kind, url, price, payload +FROM msk_raw.avito_cards ORDER BY source_id, observed_at DESC; + CREATE TABLE IF NOT EXISTS msk_raw.cian_cards ( id bigserial PRIMARY KEY, source_id bigint NOT NULL,