1

我发现了一种通过 Flask 连接到多个数据库的方法binds

导致质疑的事实:

  1. 我已经用 SQLAlchemy 定义了我自己的数据库模型。
  2. 我使用 Flask-Migrate 来生成我的数据库
  3. 我希望连接到第三方数据库并使用SQLAlchemy ORM
  4. 我希望使用 SQLAlchemy ORM 以如下方式查询第三方数据库:db.session.query(THIRDPARTYMODEL).filter_by(id=id)
  5. 我担心,一旦我定义了新模型并使用了 Flask Migrate,它会尝试创建一个新的迁移并创建我已经拥有的表。
  6. 我希望同时使用自己的数据库和第三方数据库。

如何连接到第三方数据库并使用 SQLAchemy ORM 查询它,而不用担心 Flask Migrate 会尝试在第三方数据库上生成新表?

4

2 回答 2

1

Flask-Migrate 不会自动迁移多个数据库,默认是只从 Flask-SQLAlchemy 迁移主数据库。

问题是,如果您创建了属于另一个数据库的其他模型,Alembic 会将它们视为该主数据库的一部分,因此它将为您的主数据库编写包含整个模型集的迁移。

为了让事情以您想要的方式工作,您需要确保在调用manage.py db ...命令集时不导入那些不属于主数据库的其他模型。

您还可以flask db init --multidb在初始化迁移时通过使用来告诉 Flask-Migrate 和 Alembic 支持迁移多个数据库。

于 2015-10-07T14:21:01.277 回答
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')
于 2019-09-18T20:34:48.950 回答