2016-08-10 29 views
4

我們的網絡應用程序基於金字塔框架中的sqlalchemy,我們正在尋找使用alembic來管理數據庫遷移。 Web應用程序由在一個數據庫上運行的各種軟件包組成。這意味着我們有多個需要遷移的models.py。我很困惑如何處理這個問題。我可以在env.py中使用以下幾種方法取得進展使用alembic處理多個models.py

from pkg_a.app.models import Base as pkg_a_base 
from pkg_b.app.models import Base as pkg_b_base 
from pkg_c.app.models import Base as pkg_c_base 

def combine_metadata(*args): 
    m = MetaData() 
    for metadata in args: 
     for t in metadata.tables.values(): 
      t.tometadata(m) 
    return m 
target_metadata = combine_metadata(pkg_a_base, pkg_b_base, pkg_c_base) 

這在第一次很好。但是,如果我稍後再添加一個模型,只需將其添加到此列表中並沒有太大的作用。我期待跑跑

alembic revision -m "added a new model pkg_d.models" --version-path=migrations/versions --autogenerate 

會產生,將有代碼從pkg_d.models添加表的新版本的文件。但事實並非如此。我在這裏做錯了什麼。

回答

4

如果你的軟件包是完全獨立且獨立的,那麼他們每個人都應該有一個單獨的遷移歷史 - 存儲在每個軟件包內部(pkg_a.migrationspkg_b.migrations等)或至少存儲在單獨的頂級遷移目錄中,在alembic.ini單獨的部分,並使用-n參數蒸餾器命令來指定要使用的部分:

[pkg_a] 
# path to migration scripts 
script_location = migrations_a 
sqlalchemy.url = xxx 

[pkg_b] 
script_location = migrations_b 
sqlalchemy.url = xxx 

[pkg_c] 
script_location = migrations_c 
sqlalchemy.url = xxx 

然後你就可以使用alembic revision -n pkg_a -m "added a new model pkg_a.models"

但是,如果你的模型依賴以任何方式日他們應該使用一個通用的基礎 - 你意識到你不必將所有的SQLAlchemy的東西保存在一個models.py文件中,不是嗎?我會創建一個單獨的「基礎」包,其中將包含一個常見的MetaData,Base和其他SQLAlchemy配置,然後由其他包導入。

+0

Sergey。我們的模型具有一定的依賴關係層次。是的,將所有內容全部放在一個models.py中是最不可取的。 在創建一個單獨的基礎包(這是我們實際上正在做的事情)時,我們需要做的唯一附加事情就是創建一個元數據實例並將其傳遞到declarative_base。那是對的嗎 ? 如果我們這樣做,那麼target_metadata = Base.metadata將綁定在所有表中? alembic修訂檢查過程如何找出所有從Base繼承的人? –