from __future__ import annotations import asyncio from logging.config import fileConfig import os from pathlib import Path from sqlalchemy import pool, text import sqlalchemy as sa from sqlalchemy.engine import Connection from sqlalchemy.ext.asyncio import async_engine_from_config from alembic import context # Add project root to sys.path for module imports import sys ROOT_DIR = Path(__file__).resolve().parents[1] if str(ROOT_DIR) not in sys.path: sys.path.insert(0, str(ROOT_DIR)) from app.models.database import Base, metadata_obj, DATABASE_URL # noqa: E402 # this is the Alembic Config object, which provides # access to the values within the .ini file in use. config = context.config # Interpret the config file for Python logging. if config.config_file_name is not None: fileConfig(config.config_file_name) # Override sqlalchemy.url from environment if provided url_from_env = os.environ.get("DATABASE_URL") if url_from_env: config.set_main_option("sqlalchemy.url", url_from_env) else: config.set_main_option("sqlalchemy.url", str(DATABASE_URL)) # add your model's MetaData object here # for 'autogenerate' support # from myapp import mymodel # target_metadata = mymodel.Base.metadata target_metadata = metadata_obj def run_migrations_offline() -> None: """Run migrations in 'offline' mode.""" url = config.get_main_option("sqlalchemy.url") context.configure( url=url, target_metadata=target_metadata, literal_binds=True, dialect_opts={"paramstyle": "named"}, compare_type=True, version_table_col_args={'type_': sa.String(255)}, ) with context.begin_transaction(): context.run_migrations() def do_run_migrations(connection: Connection) -> None: print(f"[Alembic] Configuring context for connection {connection}") context.configure( connection=connection, target_metadata=target_metadata, compare_type=True, version_table_col_args={'type_': sa.String(255)}, ) with context.begin_transaction(): context.run_migrations() def run_migrations_online() -> None: """Run migrations in 'online' mode.""" connectable = async_engine_from_config( config.get_section(config.config_ini_section, {}), prefix="sqlalchemy.", poolclass=pool.NullPool, future=True, ) async def async_main() -> None: async with connectable.connect() as connection: await connection.run_sync(do_run_migrations) await connectable.dispose() asyncio.run(async_main()) if context.is_offline_mode(): run_migrations_offline() else: run_migrations_online()