如何在我自己的数据库上使用 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?
我发现了一种通过 binds.
使用 Flask 连接到多个数据库的方法
引发问题的事实:
- 我已经使用 SQLAlchemy 定义了自己的数据库模型。
- 我使用 Flask-Migrate 生成我的数据库
- 我希望连接到第三方数据库并使用 SQLAlchemy ORM。
- 我希望使用 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 db init --multidb
告诉 Flask-Migrate 和 Alembic 支持迁移多个数据库。
我有同样的问题,但我无法使用公认的 include_object
解决方案,因为该方法在非迁移数据库的迁移过程中被调用得太远了。在我的例子中,用户没有写访问权限,所以一旦 Alembic 尝试在远程数据库上创建 alembic_version
table,迁移就会失败。这发生在 include_object
在任何 table 上被调用之前。
相反,因为我希望 Alembic 完全忽略此数据库及其所有 table,我只是将只读数据库放入 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')
我发现了一种通过 binds.
使用 Flask 连接到多个数据库的方法引发问题的事实:
- 我已经使用 SQLAlchemy 定义了自己的数据库模型。
- 我使用 Flask-Migrate 生成我的数据库
- 我希望连接到第三方数据库并使用 SQLAlchemy ORM。
- 我希望使用 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 db init --multidb
告诉 Flask-Migrate 和 Alembic 支持迁移多个数据库。
我有同样的问题,但我无法使用公认的 include_object
解决方案,因为该方法在非迁移数据库的迁移过程中被调用得太远了。在我的例子中,用户没有写访问权限,所以一旦 Alembic 尝试在远程数据库上创建 alembic_version
table,迁移就会失败。这发生在 include_object
在任何 table 上被调用之前。
相反,因为我希望 Alembic 完全忽略此数据库及其所有 table,我只是将只读数据库放入 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')