From 3e2e8919add65572e78e0011985f9e839c5a44ab Mon Sep 17 00:00:00 2001 From: Sergey Korotonozhko <_serezhka_@mail.ru> Date: Thu, 4 Jun 2026 14:47:46 +0300 Subject: [PATCH] =?UTF-8?q?v1.9.0:=20fix=20migration=20runner=20=E2=80=94?= =?UTF-8?q?=20=D0=B8=D0=B4=D0=B5=D0=BC=D0=BF=D0=BE=D1=82=D0=B5=D0=BD=D1=82?= =?UTF-8?q?=D0=BD=D1=8B=D0=B9=20DDL,=20=D0=BE=D0=B1=D1=80=D0=B0=D0=B1?= =?UTF-8?q?=D0=BE=D1=82=D0=BA=D0=B0=20'=D1=83=D0=B6=D0=B5=20=D1=81=D1=83?= =?UTF-8?q?=D1=89=D0=B5=D1=81=D1=82=D0=B2=D1=83=D0=B5=D1=82'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- py_service/app/migrations_runner.py | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/py_service/app/migrations_runner.py b/py_service/app/migrations_runner.py index 3241b0e..bf558e3 100644 --- a/py_service/app/migrations_runner.py +++ b/py_service/app/migrations_runner.py @@ -17,12 +17,14 @@ """ import os import glob -import asyncio +import logging from datetime import datetime from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy import text +logger = logging.getLogger("migrations") + MIGRATIONS_DIR = os.path.join(os.path.dirname(os.path.dirname(__file__)), "migrations") @@ -100,7 +102,22 @@ async def apply_migrations(db: AsyncSession) -> list: # Применяем каждый запрос try: for query in queries: - await db.execute(text(query)) + try: + await db.execute(text(query)) + except Exception as query_err: + # Idempotent DDL: CREATE TABLE IF NOT EXISTS, CREATE INDEX IF NOT EXISTS, + # ALTER TABLE ADD COLUMN IF NOT EXISTS — пропускаем если объект уже существует + err_msg = str(query_err).lower() + is_idempotent = ( + "already exists" in err_msg + or "duplicate key value violates unique constraint" in err_msg + ) + if is_idempotent: + logger.info( + "Пропускаем (уже существует): %.100s", query[:100] + ) + continue + raise # Записываем в tracking table await db.execute(