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
+18 -1
View File
@@ -17,12 +17,14 @@
""" """
import os import os
import glob import glob
import asyncio import logging
from datetime import datetime from datetime import datetime
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy import text from sqlalchemy import text
logger = logging.getLogger("migrations")
MIGRATIONS_DIR = os.path.join(os.path.dirname(os.path.dirname(__file__)), "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: try:
for query in queries: for query in queries:
try:
await db.execute(text(query)) 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 # Записываем в tracking table
await db.execute( await db.execute(