Pan*_*Lal 5 sqlalchemy pyramid alembic
我们的 Web 应用程序基于金字塔框架中的 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)
Run Code Online (Sandbox Code Playgroud)
第一次效果很好。但是,如果我稍后再添加一个模型,仅将其添加到此列表中并没有多大作用。我期待着跑步
alembic revision -m "added a new model pkg_d.models" --version-path=migrations/versions --autogenerate
Run Code Online (Sandbox Code Playgroud)
将生成一个新版本文件,其中包含用于从 pkg_d.models 添加表的代码。但事实并非如此。我在这里做错了什么。
如果包是完全独立的,然后分离它们中的每应该有一个单独的迁移历史-无论是存储在每个包(内部pkg_a.migrations,pkg_b.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
Run Code Online (Sandbox Code Playgroud)
然后你就可以使用 alembic revision -n pkg_a -m "added a new model pkg_a.models"
但是,如果您的模型以任何方式依赖,那么它们应该使用一个公共 Base - 您确实意识到您不必将所有 SQLAlchemy 内容保存在一个models.py文件中,不是吗?我会创建一个单独的“基础”包,其中包含一个通用的 MetaData、Base 和其他 SQLAlchemy 配置内容,然后由您的其他包导入。
| 归档时间: |
|
| 查看次数: |
1151 次 |
| 最近记录: |