import logging.config import sqlalchemy as sa from alembic import context from fansifter_common.adapters.db.models import autodiscover_models from sqlalchemy import Connection, create_engine, pool from resonance_engine.adapters.db import Model # Import all models and set target metadata for autogenerate support autodiscover_models("resonance_engine") target_metadata = Model.metadata def run_migrations_offline(url: sa.URL) -> None: """Run migrations in 'offline' mode.""" context.configure( url=url, target_metadata=target_metadata, literal_binds=True, dialect_opts={"paramstyle": "named"}, ) with context.begin_transaction(): context.run_migrations() def run_migrations_online(connection: Connection) -> None: """Run migrations in 'online' mode.""" context.configure( connection=connection, target_metadata=target_metadata, # DSQL does not support multi-statement DDL transactions transactional_ddl=False, ) with context.begin_transaction(): context.run_migrations() # Connection may be passed directly via alembic_config.attributes (e.g. from tests) connection = context.config.attributes.get("connection", None) if connection is not None: # Test environment: use provided connection directly run_migrations_online(connection) else: from resonance_engine.adapters import aws_dsql from resonance_engine.config import settings logging.config.dictConfig(settings.logging_config) url = settings.db_url if settings.dsql_endpoint: url = url.set(password=aws_dsql.generate_db_connect_admin_auth_token()) if context.is_offline_mode(): run_migrations_offline(url) else: engine = create_engine( url, poolclass=pool.NullPool, use_native_hstore=False, # DSQL only allows one DDL per transaction; autocommit each statement. isolation_level="AUTOCOMMIT", ) with engine.connect() as conn: run_migrations_online(conn)