我有一个非常标准的烧瓶应用程序。它使用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
文档,但这似乎是一个非常简单和常见的用例,因此我无法想象这不受支持。
有什么建议吗?
答案 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
升级脚本仍然会遇到一些麻烦,因为它会将我所有的旧表添加和删除到这个新数据库中。不知道那是什么,但很快就会知道...