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