gpt4 book ai didi

python - 为多个数据库一个一个地运行 alembic 迁移

转载 作者:搜寻专家 更新时间:2023-10-30 20:53:38 25 4
gpt4 key购买 nike

在我们的项目中,我们有多个数据库,我们使用 alembic 进行迁移。

我知道 alembic 应该只用于数据库结构迁移,但我们也将它用于数据迁移,因为将所有数据库迁移代码放在一个地方很方便。

我的问题是 alembic 一次只能处理一个数据库。因此,如果我有数据库 DB1 和 DB2,alembic 将首先运行 DB1 的所有迁移,然后运行 ​​DB2 的所有迁移。

当我们在数据库之间迁移数据时,问题就开始了。比如说,如果我在 DB1 的修订版 N 中尝试访问 DB2 中的数据,迁移可能会失败,因为 DB2 可能是修订版零或 N-X。

问题:是否可以对所有数据库一个接一个地运行 alembic 迁移,而不是为 DB1 运行所有迁移,然后为 DB2 运行所有迁移?

我目前的env.py迁移函数:

def run_migrations_online():
"""
for the direct-to-DB use case, start a transaction on all
engines, then run all migrations, then commit all transactions.
"""

engines = {}
for name in re.split(r',\s*', db_names):
engines[name] = rec = {}

cfg = context.config.get_section(name)
if not 'sqlalchemy.url' in cfg:
cfg['sqlalchemy.url'] = build_url(name)

rec['engine'] = engine_from_config(
cfg,
prefix='sqlalchemy.',
poolclass=pool.NullPool)

for name, rec in engines.items():
engine = rec['engine']
rec['connection'] = conn = engine.connect()
rec['transaction'] = conn.begin()

try:
for name, rec in engines.items():
logger.info("Migrating database %s" % name)
context.configure(
connection=rec['connection'],
upgrade_token="%s_upgrades" % name,
downgrade_token="%s_downgrades" % name,
target_metadata=target_metadata.get(name))
context.run_migrations(engine_name=name)

for rec in engines.values():
rec['transaction'].commit()
except:
for rec in engines.values():
rec['transaction'].rollback()
raise
finally:
for rec in engines.values():
rec['connection'].close()

最佳答案

虽然我自己没有测试过,但我一直在阅读 https://alembic.sqlalchemy.org/en/latest/api/script.html

这似乎是可行的,您可以使用 ScriptDirectory 遍历所有修订,检查每个数据库是否需要应用该修订,然后而不是 context.run_migrations 您可以手动调用 command.upgrade(config, revision) 来应用那个修订版。

关于python - 为多个数据库一个一个地运行 alembic 迁移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32498421/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com