Sla*_*off 6 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)
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.我的应用程序现在应该检查其他数据库.这是减号.由于我正在使用alembic实际管理数据库中的所有模式,当我运行我的典型alembic revision --autogenerate脚本时,它实际上根本没有对第二个数据库做任何事情,而且似乎只是忽略了__bind_key__这个难题.
相反,它core_user在第一个数据库中设置了正确的关系.如何向alembic表明当遇到此模式定义时,它应该在不同的数据库中创建关系?
我已经尝试更新我的alembic.ini文件,如下所示在这个(古代)线程的建议:
[core_db]
sqlalchemy.url = <DATABASE_URI>
script_location = alembic
Run Code Online (Sandbox Code Playgroud)
然后运行以下命令:
alembic -n core_db revision --autogenerate
alembic -n core_db upgrade head
Run Code Online (Sandbox Code Playgroud)
虽然生成了修订版并且这不会失败,但实际上在core_db sqlalchemy.url参数指示的数据库中没有创建任何关系.
我找不到比4岁的Google小组帖子更好的文档,但我目前的方法似乎没有用,我没有任何明显的后续步骤.我无法找到相应的alembic文档,但这似乎是一个非常简单和常见的用例,所以我无法想象这是不受支持的.
有什么建议?
对于许多不同模型的数据库来说,处理迁移是很困难的。
\n\n在我们的例子中,我们有 N 个具有不同模型的数据库。以下结构有助于保持数据库隔离:
\n\n.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 app\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 alembic.ini\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 employee\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 models.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 views.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 migrations\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 user\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 models.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 views.py\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 daemon\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 alembic.ini\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 daemon_engine.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 migrations\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 models.py\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 run.py\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 tests\nRun Code Online (Sandbox Code Playgroud)\n
到目前为止您所采取的步骤是正确的。
但是,您是否为每个数据库分配了正确的target_metadata信息?env.py
如果传入的元数据对于两个数据库相同,则不会找到不同的关系,因此自动生成的脚本将不会反映您正在查找的内容。
通过查看Base.metadata.tables变量来检查哪些表与元数据关联。
仅传入每个数据库所需的表env.py。您应该为每个数据库在各自的script_location.
| 归档时间: |
|
| 查看次数: |
2880 次 |
| 最近记录: |