我们的网络应用程序基于金字塔框架中的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添加表的代码。但事实并非如此。我在这里做错了什么。
答案 0 :(得分:4)
如果您的包完全独立且独立,那么每个包都应该有一个单独的迁移历史记录 - 存储在每个包中(pkg_a.migrations
,pkg_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配置,然后由其他包导入。