【发布时间】:2020-08-26 22:40:57
【问题描述】:
为了介绍我们应用程序的一些背景知识,我们已经为应用程序中的现有端点配置了一个数据库。现在有一个新要求,即向同一个应用程序添加与不同数据库通信的端点。如flask-sqlalchemy文档中所述,为了使Flask-Migrate与多个数据库一起工作,我们删除了以前的迁移,在配置中添加了SQLALCHEMY_BINDS,在模型中添加了bind_key并使用了以下命令;
flask db init --multidb
这使用版本文件夹成功创建了一个全新的迁移文件夹。然后我们使用下面的命令;
flask db migrate
这使用适当的迁移代码(由 Alembic 自动创建)创建了一个新的迁移文件,用于在新数据库中创建新表,并且还在新数据库中添加了 alembic_version 表。没有向旧/现有数据库的新创建迁移文件添加迁移代码(如预期的那样),因为没有对与该现有数据库关联的模型进行任何更改。然后我们继续做:
flask db upgrade
一切都按预期进行。这些表已在新数据库中成功创建,我们能够使用新定义的端点与表进行交互。
现在,需要向第二个数据库中新创建的表添加新列。因此,我们在模型中添加了列,现在我们再次尝试migrate,但我们不断收到以下错误:
INFO [alembic.env] Migrating database <default>
INFO [alembic.runtime.migration] Context impl SQLiteImpl.
INFO [alembic.runtime.migration] Will assume non-transactional DDL.
ERROR [root] Error: Target database is not up to date.
到目前为止我们所尝试的,
- 已删除迁移文件夹。
- 重新运行 init-migrate-upgrade 循环。
- 确保所有 alembic 版本都同步(两个数据库中的 alembic 表,位于 repo 中)。
- 我们还尝试进行单个数据库迁移,并且成功了。不知何故,迁移多个数据库时似乎出现了问题。
原始配置(单个 DB):
# DB path definition
SQLALCHEMY_DATABASE_URI='full_path_to_db'
# Model
class Table1(db.Model):
#column declarations with datatypes
新配置(使用多数据库):
# DB Path definitions (NOT using SQLALCHEMY_DATABASE_URI anymore, using SQLALCHEMY_BINDS instead.)
SQLALCHEMY_BINDS = {
'db1': 'full_path_to_db',
'db2': 'full_path_to_db'
}
# Models
class Table1(db.Model):
__tablename__ = 'table1'
__bind_key__ = 'db1'
#column declarations
class Table2(db.Model):
__tablename__ = 'table2'
__bind_key__ = 'db2'
#column declarations
但错误没有得到解决。我不确定我们在这里缺少什么。
重申一下,第一次/初始迁移(和升级)工作正常。两个 DB 上的 alembic_version 表都使用正确的迁移版本号正确更新。但是此后,当我们对模型进行任何更改并需要进行第二次迁移时,不会创建新的迁移文件,并且会抛出错误目标数据库未找到。
感谢您的帮助!
【问题讨论】:
标签: python flask flask-sqlalchemy alembic flask-migrate