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(