open:alembic

alembic

alembic is great but lacks an out of the box way to set up running migrations against a specific database (e.g. development, test, production). The following adjustments to its env.py and alembic.ini allow us to target a specific database:

Example:

snippet.bash
alembic -x db=development upgrade head

env.py:

snippet.python
target_metadata = None
 
cmd_kwargs = context.get_x_argument(as_dictionary=True)
if 'db' not in cmd_kwargs:
    raise Exception('We couldn\'t find `db` in the CLI arguments. '
                    'Please verify `alembic` was run with `-x db=<db_name>` '
                    '(e.g. `alembic -x db=development upgrade head`)')
db_name = cmd_kwargs['db']
# ... 
def run_migrations_online():
    """Run migrations in 'online' mode.
 
    In this scenario we need to create an Engine
    and associate a connection with the context.
 
    """
    # Overload db config on top of alembic config
    alembic_config = config.get_section(config.config_ini_section)
    db_config = config.get_section(db_name)
    for key in db_config:
        alembic_config[key] = db_config[key]
 
    engine = engine_from_config(
        alembic_config,
        prefix='sqlalchemy.',
        poolclass=pool.NullPool)

alembic.ini:

[alembic]
# ...

[development]
sqlalchemy.url = postgresql://localhost/dev

[test]
sqlalchemy.url = postgresql://localhost/test

[production]
sqlalchemy.url = postgresql://production/prod

  • open/alembic.txt
  • 마지막으로 수정됨: 2022/01/06 04:54
  • 저자 127.0.0.1