v1.9.0: fix migration runner — идемпотентный DDL, обработка 'уже существует'
This commit is contained in:
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user