fix(ptica): land_reservation перестаёт копить дубли — 91% таблицы были копиями (#2464) #2966

Merged
bot-backend merged 2 commits from fix/2464-land-reservation-dedup into main 2026-08-20 10:16:35 +00:00
2 changed files with 15 additions and 9 deletions
Showing only changes of commit 03926a5d0b - Show all commits

View file

@ -190,15 +190,15 @@ def test_migration_body_runs_on_a_prod_shaped_replica(db) -> None:
sql = _MIGRATION.read_text() sql = _MIGRATION.read_text()
body = sql[sql.index("BEGIN;") + len("BEGIN;") : sql.rindex("COMMIT;")] body = sql[sql.index("BEGIN;") + len("BEGIN;") : sql.rindex("COMMIT;")]
for chunk in body.split(";"): # Комментарии снимаем ДО разбиения на выражения — иначе точка с запятой внутри
# Срезаем ведущие строки-комментарии, а не пропускаем кусок целиком: # комментария разрежет SQL посередине. Обе ловушки этот тест уже ловил на себе:
# DELETE в миграции идёт СРАЗУ ПОСЛЕ комментария, и наивный пропуск # сперва пропуск куска, начинающегося с «--» (потерялся DELETE, репетиция упала
# «кусков, начинающихся с --» молча выкинул бы его. Первая версия этого # на ADD CONSTRAINT), затем «;» в тексте комментария.
# теста так и сделала — репетиция упала на ADD CONSTRAINT, и это было code = "\n".join(
# ровно то, что она и должна ловить. ln for ln in body.splitlines() if ln.strip() and not ln.lstrip().startswith("--")
stmt = "\n".join( )
ln for ln in chunk.splitlines() if ln.strip() and not ln.lstrip().startswith("--") for chunk in code.split(";"):
).strip() stmt = chunk.strip()
if stmt: if stmt:
db.execute(text(stmt)) db.execute(text(stmt))

View file

@ -33,6 +33,12 @@
BEGIN; BEGIN;
-- #2752: блокирующий DDL обязан иметь lock_timeout — иначе ALTER TABLE встанет в
-- очередь за чужой сессией и уведёт за собой запросы приложения. Таблица крошечная
-- (297 строк), сам DDL мгновенный; пять секунд — про ОЖИДАНИЕ блокировки, не про
-- работу. Не дождались — миграция падает, а не подвешивает прод.
SET LOCAL lock_timeout = '5s';
-- 1) Дедуп: оставляем строку с минимальным id в каждой группе. -- 1) Дедуп: оставляем строку с минимальным id в каждой группе.
DELETE FROM land_reservation a DELETE FROM land_reservation a
USING land_reservation b USING land_reservation b