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

Posted

技术标签:

【中文标题】如何在我自己的数据库上使用 flask Migrate 和 SQLAlchemy,并连接到我不想迁移的第三方数据库?【英文标题】:How do I use flask Migrate and SQLAlchemy on my own database, and connect to a third party database that I do not wish to migrate? 【发布时间】:2015-10-06 16:57:04 【问题描述】:

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

引发问题的事实:

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

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

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

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

我有同样的问题,但我无法使用已接受的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')

【讨论】:

以上是关于如何在我自己的数据库上使用 flask Migrate 和 SQLAlchemy,并连接到我不想迁移的第三方数据库?的主要内容,如果未能解决你的问题,请参考以下文章

如何在我的页面上嵌入 Flask-Security 登录表单?

如何使用Flask从MySQL获取数据集?

如何在我的 venv 本地运行 App Platform 的 Flask 应用程序?

Vue CLI - 如何在多个页面上拥有组件(Flask)

如何在我的 locustfile.py 中将一些输入传递给我的 Flask AI API

如何通过gevent使用Flask(uWSGI 和Gunicorn 版本)