【发布时间】:2018-06-29 05:24:32
【问题描述】:
我有一个在 sqlite 内存数据库上创建的 SQLAlchemy 声明性基础:
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
我将它用于单元测试逻辑。
有了这个,我在数据库中有我的表。但现在我希望使用 alembic 迁移某些东西。
AFAIK alembic 迁移使用 env.py run_migrations_online 并使用名为 engine_from_config 的 SQLAlchemy 函数在此处创建新引擎。
我希望解决的问题是有一种方法可以使用先前创建的连接(其中包含最近创建的表)进行 alembic 迁移。
我在我的测试脚本中使用了这个:Using Alembic API from inside application code,以便我的脚本在之前的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 在这里没有用,事实上,我只是在复制我引用的其他帖子使用的内容)。
【问题讨论】:
-
您要生成修订版还是只进行升级?
-
@georgexsh 只是升级。
-
run_migrations_online内部需要一个connection对象,您可以从现有引擎创建一个:connection = db.engine.connect(),它适用于我。 -
是的,但是在以编程方式调用 alembic 时如何传递现有连接?
-
所以这个数据库只要应用程序存在就存在,对吗?您打算实时运行迁移吗?这是如何运作的?你如何“热更新”你的模型?
标签: python sqlite sqlalchemy database-migration alembic