|
Some checks are pending
Deploy / build-frontend (push) Blocked by required conditions
Deploy / deploy (push) Blocked by required conditions
Deploy / changes (push) Waiting to run
Deploy / build-backend (push) Blocked by required conditions
Deploy / build-worker (push) Blocked by required conditions
UNIQUE (obj_id, doc_type, doc_num, file_url) в м.112 без NULLS NOT DISTINCT, doc_num nullable. В PG NULL != NULL в уникальном индексе → для документов с docNum=null (документированный частый вход: extract_documents:125-134 → doc_num=None) ON CONFLICT-арбитр в scrapers/documents.py:59 НИКОГДА не матчился → каждый ежедневный sweep domrf_kn.py:1903 молча вставлял новую строку-дубль вместо UPDATE. Таблица росла ×N прогонов; дубли уходили в analytics_queries.py:1068. Миграция 140: 1. Дедуп существующих NULL-дублей: ROW_NUMBER() PARTITION BY все 4 ключа ORDER BY scraped_at DESC, id DESC → оставляем самую свежую, удаляем остальные WHERE rn>1 AND doc_num IS NULL. 2. DROP старого autonamed constraint'а IF EXISTS. 3. ADD uq_domrf_kn_documents_logical UNIQUE NULLS NOT DISTINCT (...) с именованным guard по pg_constraint.conname (паттерн м.125 → idempotent). Caller scrapers/documents.py НЕ меняется — после миграции ON CONFLICT- арбитр начнёт матчить NULL-doc_num строки автоматически. Прецедент того же класса: м.110 (uq_infra_dedupe), м.125 (uq_supply_layers_logical). Closes #1206 |
||
|---|---|---|
| .. | ||
| pat | ||
| sql | ||
| playwright_state.json | ||