簡體   English   中英

多個數據庫一對一運行Alembic遷移

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM