作者:手机用户2502887521 | 来源:互联网 | 2022-12-31 17:43
我在sqlite内存DB上创建了一个SQLAlchemy声明式Base:
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
我正在使用它来进行单元测试逻辑.
有了这个我在DB中有我的表.但现在我希望使用alembic迁移某些东西.
AFAIK env.py
alembic 迁移使用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
[请注意,我只是通过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
据我所知,cOnnectable=engine_from_config
在新sqlite:///:memory:
数据库上创建了与新引擎的连接,这就是为什么我无法通过alembic升级我脚本中先前创建的数据库的原因create_all(engine)
.
所以...... TLDR; 有没有办法将我以前存在的引擎连接(使用我创建的表)传递给alembic,以便它可以迁移它?(我很确定我创建的dbPath arg在这里没用,事实上,我只是复制我引用的其他帖子使用的内容).