v1.9.0: fix migration runner — идемпотентный DDL, обработка 'уже существует'
Tests / test (push) Has been cancelled
Tests / test-max-bot (push) Has been cancelled

This commit is contained in:
2026-06-04 14:47:46 +03:00
parent f06ecaabe3
commit 3e2e8919ad
+19 -2
View File
@@ -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(