fix(msk): миграция 299 заводит схему msk_raw сама, а не полагается на прод
Some checks failed
CI Trade-In / changes (pull_request) Successful in 9s
CI / changes (pull_request) Failing after 9s
CI Trade-In / browser-tests (pull_request) Has been skipped
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 5m12s

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 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VQ8jqr4SFirX5tFLwdSrXh
This commit is contained in:
bot-backend 2026-09-12 00:27:09 +03:00
parent de5f4a32cd
commit 7b84e4d2a5

View file

@ -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,