diff --git a/IMPLEMENTATION_STATUS.md b/IMPLEMENTATION_STATUS.md index 2b9dd5b..5e67f65 100644 --- a/IMPLEMENTATION_STATUS.md +++ b/IMPLEMENTATION_STATUS.md @@ -55,8 +55,24 @@ **Полностью реализовано**: - ✅ BACKEND: Models, Repositories, Services, API Endpoints - ✅ FRONTEND: Contexts, API Client, Components, LibraryPage Integration +- ✅ DOCKER: Auto-migrations on startup (async/sync boundary fix) -**Готово к тестированию!** +**Готово к deployment!** + +--- + +## КРИТИЧЕСКИЕ ИСПРАВЛЕНИЯ + +### Auto-Migration Fix (database.py) +**Проблема**: RuntimeWarning: coroutine 'run_async_migrations' was never awaited +**Причина**: Alembic - синхронная библиотека, но получала async database URL +**Решение**: Конвертация async URL в sync перед передачей в Alembic +- `sqlite+aiosqlite://` → `sqlite:///` +- `postgresql+asyncpg://` → `postgresql://` + +**Файлы**: +- `backend/src/app/infra/database.py:78-80` - URL conversion +- `backend/Dockerfile:25-26` - Copy alembic files to container --- diff --git a/backend/src/app/infra/database.py b/backend/src/app/infra/database.py index 49bb651..1985628 100644 --- a/backend/src/app/infra/database.py +++ b/backend/src/app/infra/database.py @@ -57,25 +57,37 @@ async def init_db() -> None: def run_migrations() -> None: - """Run Alembic migrations.""" + """ + Run Alembic migrations synchronously. + + Alembic is sync-only, so we convert async URL to sync URL. + """ from pathlib import Path from alembic import command from alembic.config import Config from loguru import logger - # Find alembic.ini (works in both dev and Docker) + # Find alembic.ini alembic_ini_path = Path(__file__).parent.parent.parent.parent / "alembic.ini" if not alembic_ini_path.exists(): logger.warning(f"alembic.ini not found at {alembic_ini_path}, skipping migrations") return + # Convert async database URL to sync for Alembic + sync_db_url = settings.database_url.replace("sqlite+aiosqlite://", "sqlite:///") + sync_db_url = sync_db_url.replace("postgresql+asyncpg://", "postgresql://") + # Create Alembic config alembic_cfg = Config(str(alembic_ini_path)) - alembic_cfg.set_main_option("sqlalchemy.url", settings.database_url) + alembic_cfg.set_main_option("sqlalchemy.url", sync_db_url) - # Run migrations + # Run migrations synchronously logger.info("Running Alembic migrations...") - command.upgrade(alembic_cfg, "head") - logger.info("Migrations completed successfully") + try: + command.upgrade(alembic_cfg, "head") + logger.info("Migrations completed successfully") + except Exception as e: + logger.error(f"Migration failed: {e}") + raise