首页 > 解决方案 > 项目中的 Alembic、SQLAlchemy 和多个“应用程序”

问题描述

从 Django 的世界来到 SQLAlchemy,我希望将一个项目拆分为多个应用程序,其中模型和视图根据它们的用途捆绑在一起。

例如,我正在编写一个规划器应用程序,我希望在我的项目中拥有UsersPlans居住在单独的应用程序中。我想确保如果我必须将这个项目分成更小的项目,我可以做的工作量最少。

我还希望能够使用一个命令相应地生成和运行迁移,这样我就不必在每次添加模型或“应用程序”时重新配置我的 CI 构建。

到目前为止,我在这方面能想到的是

项目结构:

my_planner
  +- users
  |  +- migrations
  |  |  +- versions
  |  |  |  +- 0000_initial.py
  |  |  +- __init__.py
  |  |  +- env.py
  |  |  +- script.py.mako
  |  +- __init__.py
  |  +- models.py
  +- plans (same structure as users)

alembic.ini:

[alembic]
script_location = alembic/migrations # this doesn't seem to matter
version_locations = users/migrations/versions plans/migrations/options

[users]
script_location = users/migrations

[plans]
script_location = plans/migrations

然后我必须将env.py文件放入我的migrations文件夹中,并将我想要包含在自动迁移中的模型导入。

但是,当我生成自动迁移时,我必须指定为其生成它们的确切“应用程序”并指定一个分支。

PYTHONPATH=. alembic --name users revision -m 'initial'  --rev-id='0000' --branch-label users --autogenerate

当我应用迁移时,我必须为每个分支分别应用它们。

有没有办法在一个命令中相应地完成这些事情而无需编写我自己的自定义脚本?还是有另一种管理迁移的方法?

标签: sqlalchemydatabase-migrationalembic

解决方案


不幸的是,我还没有找到一种开箱即用的方法来做到这一点。我写了关于我们在这里采用的方法。

它的要点是;

  • 创建通用迁移功能
  • 向每个应用程序(架构、元数据)添加一个包含应用程序特定信息的迁移目录
  • 将您的相关应用部分添加到 alembic.ini 文件中,引用每个目录
  • 使用从基础开始的分支分别跟踪每个应用程序的迁移

推荐阅读