我发现了一种通过binds与Flask连接到多个数据库的方法。
提出问题的事实:
db.session.query(THIRDPARTYMODEL).filter_by(id=id)
如何连接到第三方数据库并使用SQLAchemy ORM查询它而不必担心Flask Migrate尝试在第三方数据库上生成新表?
答案 0 :(得分:1)
Flask-Migrate不会自动迁移多个数据库,默认情况下只从Flask-SQLAlchemy迁移主数据库。
问题在于,如果您创建了属于另一个数据库的其他模型,Alembic会将它们视为该主数据库的一部分,因此它将为您的主数据库编写包含整个模型集的迁移。
为了让事情按照您想要的方式运行,您需要确保在调用manage.py db ...
命令集时不会导入那些不属于主数据库的其他模型。
您也可以告诉Flask-Migrate和Alembic支持在初始化迁移时使用flask db init --multidb
迁移多个数据库。
答案 1 :(得分:0)
我遇到了同样的问题,但是我无法使用公认的include_object
解决方案,因为该方法在非迁移数据库上的迁移中调用得太多了。在我的情况下,用户没有写访问权,因此,当Alembic尝试在远程数据库上创建alembic_version
表时,迁移就失败了。这是在任何一个表上调用include_object
之前发生的。
相反,因为我希望Alembic完全忽略此数据库及其所有表,所以我只将只读数据库放在SQLALCHEMY_BINDS
中,然后在处理之前将其放在migrations/env.py
中:>
# ===Generated code===
bind_names = []
for name, url in current_app.config.get("SQLALCHEMY_BINDS").items():
context.config.set_section_option(name, "sqlalchemy.url", url.replace(
'%', '%%'))
bind_names.append(name)
# ===New code===
### Remove the 'remote' bind, which is a read-only database that we don't
### want to track migration changes on.
if 'remote' in bind_names:
bind_names.remove('remote')