Python 3.x 如何在自己的数据库上使用flask Migrate和SQLAlchemy,并连接到不希望迁移的第三方数据库?

Python 3.x 如何在自己的数据库上使用flask Migrate和SQLAlchemy,并连接到不希望迁移的第三方数据库?,python-3.x,orm,flask,sqlalchemy,flask-migrate,Python 3.x,Orm,Flask,Sqlalchemy,Flask Migrate,我发现了一种通过Flask连接多个数据库的方法 导致问题的事实: 我用SQLAlchemy定义了自己的数据库模型 我使用Flask Migrate生成数据库 我希望连接到第三方数据库并使用 我希望使用SQLAlchemy ORM以如下方式查询第三方数据库:db.session.query(THIRDPARTYMODEL).filter_by(id=id) 我担心,一旦我定义了新模型并使用Flask Migrate,它就会尝试创建新的迁移并创建我已经拥有的表 我希望同时使用我自己的数据库和第三方数

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

导致问题的事实:

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

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

    Flask Migrate不会自动迁移多个数据库,默认情况下仅从Flask SQLAlchemy迁移主数据库

    问题在于,如果您创建了属于另一个数据库的其他模型,ALEMBIC将将其视为该主数据库的一部分,因此它将为包含整个模型集的主数据库编写迁移。 要使事情按您想要的方式运行,您需要确保在调用

    manage.py db…
    命令集时不会导入不属于主数据库的其他模型


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

    我也有同样的问题,但我无法使用已接受的
    include\u对象解决方案,因为该方法在未迁移的数据库上的迁移中调用得太远。在我的例子中,用户没有写访问权限,因此只要Alembic尝试在远程DB上创建
    Alembic_version
    表,迁移就失败了。这发生在对任何表调用
    include\u object
    之前

    相反,因为我希望Alembic完全忽略此数据库及其所有表,所以我只需将只读数据库放在
    SQLALCHEMY\u 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')
    

    谢谢@miguel昨天我通过编辑env.py文件解决了这个问题,使用了“include_object”函数并将其值传递给上下文。configure(include_object)这感觉有点粗糙,因为env.py是生成的,我的源代码管理中没有跟踪我的迁移文件夹。(使用.gitignore)在我看来,这是一个可以接受的解决方案,但您必须在源代码管理中包含迁移文件。如果您丢失了这些文件,您将无法重新创建数据库的历史记录。