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在这里没用,事实上,我只是复制我引用的其他帖子使用的内容).
您可以创建一个 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)
可能需要一些微调,但这就是事情的总体要点。
| 归档时间: |
|
| 查看次数: |
888 次 |
| 最近记录: |