From 1b6461eb152517bb2d30fb440abda4f3d30f3c91 Mon Sep 17 00:00:00 2001 From: lekss361 Date: Sat, 23 May 2026 15:58:53 +0300 Subject: [PATCH] =?UTF-8?q?fix(tradein):=20030=20=E2=80=94=20UNIQUE=20cons?= =?UTF-8?q?traint=20on=20avito=5Fimv=5Fevaluations.cache=5Fkey?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Hotfix для unblock PR #452 (Stage 3 IMV estimator integration). Миграция 018 (Stage 1) создала только non-unique imv_cache_key_idx — но save_imv_evaluation использует ON CONFLICT (cache_key) DO UPDATE, что требует UNIQUE/exclusion constraint, иначе: ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification Этот PR: - DELETE дублей по cache_key (защитно, на свежей БД no-op) - CREATE UNIQUE INDEX IF NOT EXISTS imv_cache_key_uniq_idx ON avito_imv_evaluations(cache_key) Idempotent: повторный apply — NOTICE, без ошибок. Без CONCURRENTLY — таблица свежая (cache_key никогда не writev до PR #452). Reviewer: deep-code-reviewer on PR #452. --- .../sql/030_avito_imv_cache_key_unique.sql | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 tradein-mvp/backend/data/sql/030_avito_imv_cache_key_unique.sql diff --git a/tradein-mvp/backend/data/sql/030_avito_imv_cache_key_unique.sql b/tradein-mvp/backend/data/sql/030_avito_imv_cache_key_unique.sql new file mode 100644 index 00000000..3112e322 --- /dev/null +++ b/tradein-mvp/backend/data/sql/030_avito_imv_cache_key_unique.sql @@ -0,0 +1,26 @@ +-- 030_avito_imv_cache_key_unique.sql +-- Hotfix: добавить UNIQUE constraint на avito_imv_evaluations.cache_key +-- +-- Stage 1 миграция 018 создала только non-unique `imv_cache_key_idx` — +-- но `save_imv_evaluation` использует `ON CONFLICT (cache_key) DO UPDATE`, +-- что требует UNIQUE/exclusion constraint, иначе runtime error: +-- ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification +-- +-- Закрывает blocker reviewer'а на PR #452 (Stage 3 IMV estimator integration). +-- +-- Apply after: 018_avito_imv_evaluations.sql (Stage 1) +-- Required by: estimator IMV cache save flow (Stage 3, PR #452) + +BEGIN; + +-- Защитная очистка дубликатов по cache_key (если данные уже наливались). +-- На свежей БД (cache_key никогда не writev до этого PR) — no-op. +DELETE FROM avito_imv_evaluations a +USING avito_imv_evaluations b +WHERE a.id < b.id AND a.cache_key = b.cache_key; + +-- Сам UNIQUE constraint через индекс (CONCURRENTLY не нужен — таблица свежая/пустая). +CREATE UNIQUE INDEX IF NOT EXISTS imv_cache_key_uniq_idx + ON avito_imv_evaluations (cache_key); + +COMMIT;