使用alembic处理多个models.py

时间:2016-08-10 16:25:53

标签: sqlalchemy pyramid alembic

我们的网络应用程序基于金字塔框架中的sqlalchemy,我们希望使用alembic来管理数据库迁移。 Web应用程序包含在一个数据库上运行的各种包。这意味着我们需要迁移多个models.py.我很困惑如何处理这个问题。我可以在env.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添加表的代码。但事实并非如此。我在这里做错了什么。

1 个答案:

答案 0 :(得分:4)

如果您的包完全独立且独立,那么每个包都应该有一个单独的迁移历史记录 - 存储在每个包中(pkg_a.migrationspkg_b.migrations等)或至少存储在单独的顶部-level migrations目录,在alembic.ini中有一个单独的部分,并使用-n参数到alembic命令来指定要使用的部分:

[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"

但是,如果您的模型以任何方式依赖,那么它们应该使用公共Base - 您确实意识到您不必将所有SQLAlchemy内容保存在单个models.py文件中,不是吗? ?我将创建一个单独的“基础”包,其中包含一个常见的MetaData,Base和其他SQLAlchemy配置,然后由其他包导入。