[英]Run alembic migrations one by one for multiple databases
在我們的項目中,我們有多個數據庫,並且使用Alembic進行遷移。
我知道alembic應該僅用於數據庫結構遷移,但我們也將其用於數據遷移,因為將所有數據庫遷移代碼放在一個位置很方便。
我的問題是,Alembic一次只能在一個數據庫上工作。 因此,如果我有數據庫DB1和DB2,那么alembic將首先運行DB1的所有遷移,然后再運行DB2的所有遷移。
當我們在數據庫之間遷移數據時,問題就開始了。 假設,如果我在DB1的修訂版N中嘗試訪問DB2中的數據,則遷移可能會失敗,因為DB2可以是修訂版零或NX。
問題 :是否可以針對所有數據庫一個一運行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()
雖然我自己尚未對此進行測試,但我一直在閱讀http://alembic.readthedocs.org/en/latest/api/script.html
似乎可以使用ScriptDirectory遍歷所有修訂版,檢查每個數據庫是否需要應用該修訂版,然后可以使用context.run_migrations手動調用command.upgrade(config,version)來應用該修訂版,這似乎是可行的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.