将alembic与多个数据库一起使用

时间:2016-07-09 23:48:58

标签: python postgresql flask flask-sqlalchemy alembic

我有一个非常标准的烧瓶应用程序。它使用flask_sqlalchemy来管理与postgres服务器的连接,并使用alembic来管理迁移。

现在的问题是我正在将它与另一个项目集成,这意味着我正在尝试允许它从另一个数据库中提取单个模型。幸运的是,flask_sqlalchemy通过SQLALCHEMY_BINDS标志对此有很大的支持。所以我的应用程序设置了这样的新模型:

class CoreUser(UserMixin, db.Model):
    __bind_key__ = 'core'

    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(255), unique=True)

到目前为止一切顺利。我的应用程序现在应该检查其他数据库。这是减号。因为我使用alembic来实际管理数据库中的所有模式,所以当我运行我的典型alembic revision --autogenerate脚本时,它根本不对第二个数据库做任何事情,而且似乎只需忽略拼图的__bind_key__部分。

相反,它在第一个数据库中设置了正确的core_user关系。如何向alembic表明当遇到此模式定义时,它应该在不同的数据库中创建关系?

我已尝试更新alembic.ini文件,如下所示this(古代)帖子的建议:

[core_db]
sqlalchemy.url = <DATABASE_URI>
script_location = alembic

然后运行以下命令:

alembic -n core_db revision --autogenerate
alembic -n core_db upgrade head

虽然生成了修订版并且这不会失败,但core_db sqlalchemy.url参数指示的数据库中实际上没有创建任何关系。

我找不到比4岁Google小组帖子更好的文档,但我目前的做法似乎不起作用,我没有任何明显的后续步骤。我无法找到合适的alembic文档,但这似乎是一个非常简单和常见的用例,因此我无法想象这不受支持。

有什么建议吗?

3 个答案:

答案 0 :(得分:1)

到目前为止您采取的步骤是正确的。

但是,您是否为每个数据库在target_metadata中分配了正确的env.py

如果传入的元数据对于两个数据库都是相同的,则不会找到不同的关系,因此自动生成的脚本不会反映您正在寻找的内容。

通过查看Base.metadata.tables变量,检查哪些表与元数据相关联。

仅传入每个数据库env.py所需的表。您应该在各自的script_location中为每个数据库添加一个。

答案 1 :(得分:1)

使用不同型号来处理许多数据库的迁移很困难。

在我们的例子中,我们有N个不同模型的数据库。以下结构有助于保持数据库隔离:

.
├── app
│   ├── __init__.py
│   ├── alembic.ini
│   ├── employee
│   │   ├── __init__.py
│   │   ├── models.py
│   │   └── views.py
│   ├── migrations
│   └── user
│       ├── __init__.py
│       ├── models.py
│       └── views.py
├── daemon
│   ├── __init__.py
│   ├── alembic.ini
│   ├── daemon_engine.py
│   ├── migrations
│   └── models.py
├── run.py
└── tests

答案 2 :(得分:0)

通过在此处使用flask-sqlalchemy及其alembic选项,我可以将其与flask-migrate--multidb一起使用:

https://flask-migrate.readthedocs.io/en/latest/#multiple-database-support

然后我不得不修改我所有的旧数据库迁移(当我只有一个数据库时),如下所述:

https://github.com/miguelgrinberg/Flask-Migrate/issues/181

升级脚本仍然会遇到一些麻烦,因为它会将我所有的旧表添加和删除到这个新数据库中。不知道那是什么,但很快就会知道...