"""Alembic async env — matches the sibling-service house pattern (user-service et al.). Reads the live DB URL from app settings (overriding the alembic.ini placeholder), targets Base.metadata (all models live in app.db.models), and runs migrations on the async engine. """ import asyncio import sys from logging.config import fileConfig from pathlib import Path # Ensure the project root is importable when alembic runs via the console script. PROJECT_ROOT = Path(__file__).resolve().parents[1] if str(PROJECT_ROOT) not in sys.path: sys.path.insert(0, str(PROJECT_ROOT)) from alembic import context from sqlalchemy import pool from sqlalchemy.ext.asyncio import async_engine_from_config from app.config import get_settings from app.db.models import Base # importing Base registers every model on Base.metadata settings = get_settings() config = context.config # Live URL from settings (DATABASE_URL) overrides the ini placeholder; fall back to the ini value. config.set_main_option("sqlalchemy.url", settings.DATABASE_URL or config.get_main_option("sqlalchemy.url")) if config.config_file_name is not None: fileConfig(config.config_file_name) target_metadata = Base.metadata def run_migrations_offline() -> None: url = config.get_main_option("sqlalchemy.url") context.configure(url=url, target_metadata=target_metadata, literal_binds=True, dialect_opts={"paramstyle": "named"}) with context.begin_transaction(): context.run_migrations() def do_run_migrations(connection): context.configure(connection=connection, target_metadata=target_metadata) with context.begin_transaction(): context.run_migrations() async def run_async_migrations() -> None: connectable = async_engine_from_config( config.get_section(config.config_ini_section, {}), prefix="sqlalchemy.", poolclass=pool.NullPool, ) async with connectable.connect() as connection: await connection.run_sync(do_run_migrations) await connectable.dispose() def run_migrations_online() -> None: asyncio.run(run_async_migrations()) if context.is_offline_mode(): run_migrations_offline() else: run_migrations_online()