如何在我自己的数据库上使用flask Migrate和SQLAlchemy,并连接到我不想迁移的第三方数据库?

时间:2015-10-06 16:57:04

标签: python-3.x orm flask sqlalchemy flask-migrate

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

提出问题的事实:

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

2 个答案:

答案 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')