Alembic使用现有的SQLAlchemy引擎进行迁移

Jav*_* C. 9 python sqlite sqlalchemy database-migration alembic

我在sqlite内存DB上创建了一个SQLAlchemy声明式Base:

engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
Run Code Online (Sandbox Code Playgroud)

我正在使用它来进行单元测试逻辑.

有了这个我在DB中有我的表.但现在我希望使用alembic迁移某些东西.

AFAIK env.pyalembic 迁移使用run_migrations_online,并使用一个名为engine_from_config在此创建新引擎的SQLAlchemy函数.

我想要解决的问题是有一种方法可以使用先前创建的连接,该连接保存最近创建的表,用于alembic迁移.

我在我的测试脚本上使用了这个:在应用程序代码中使用Alembic API,以便我的脚本在上一次create_all调用之后执行以下操作:

import alembic.config
alembicArgs = ['--raiseerr', '-x', 'dbPath=sqlite:///:memory:', 'upgrade', 'head']
alembic.config.main(argv=alembicArgs
Run Code Online (Sandbox Code Playgroud)

[请注意,我只是通过Base.metadata.create_all(engine)调用创建我的模式,但我的alembic版本不仅包含模式更改,它们还有一些目录表数据的填充,这就是为什么我打算在这里使用alembic.事实上,如果我的alembic迁移持有一些"创建表"逻辑,那么这两者就会发生冲突.所以我可以安全地删除create_all调用并依赖于alembic来创建我的模式.]

已经修改了我的alembic env.py:

def run_migrations_online():
    ini_section = config.get_section(config.config_ini_section)

    db_path = context.get_x_argument(as_dictionary=True).get('dbPath')

    if db_path:
        ini_section['sqlalchemy.url'] = db_path

    connectable = engine_from_config(
        ini_section,
        prefix ... # everything from here the same as default env.py
Run Code Online (Sandbox Code Playgroud)

据我所知,connectable=engine_from_config在新sqlite:///:memory:数据库上创建了与新引擎的连接,这就是为什么我无法通过alembic升级我脚本中先前创建的数据库的原因create_all(engine).

所以...... TLDR; 有没有办法将我以前存在的引擎连接(使用我创建的表)传递给alembic,以便它可以迁移它?(我很确定我创建的dbPath arg在这里没用,事实上,我只是复制我引用的其他帖子使用的内容).

Het*_*oni 4

您可以创建一个 alembic 配置实例并对其进行操作:

def migrate_in_memory(migrations_path, alembic_ini_path=None, connection=None, revision="head"):
    config = alembic.config.Config(alembic_ini_path)
    config.set_main_option('script_location', migrations_path)
    config.set_main_option('sqlalchemy.url', 'sqlite:///:memory:')
    if connection is not None:
        config.attributes['connection'] = connection
    alembic.command.upgrade(config, revision)
Run Code Online (Sandbox Code Playgroud)

可能需要一些微调,但这就是事情的总体要点。

  • 啊!!这就是我需要让它工作的东西。太感谢了!http://alembic.zzzcomputing.com/en/latest/cookbook.html#connection-sharing (2认同)