问题描述
为使我们的应用程序具有一些背景知识,我们已经为应用程序中的现有端点配置了一个数据库。现在,有一个新要求,即向与不同数据库通信的同一应用程序添加端点。如此处的flask-sqlalchemy文档所述,为了使Flask-Migrate与多个数据库一起工作,我们删除了先前的迁移,在配置中添加了sqlALCHEMY_BINDS
,在模型中添加了bind_key
,并使用了以下命令;
flask db init --multidb
此操作成功创建了一个全新的migrations文件夹,其中包含versions文件夹。然后我们使用以下命令;
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表,都位于回购中)。
- 我们还尝试了一次数据库迁移,并且成功了。迁移多个数据库时似乎有点问题。
原始配置(单个DB):
# DB path deFinition
sqlALCHEMY_DATABASE_URI='full_path_to_db'
# Model
class Table1(db.Model):
#column declarations with datatypes
新配置(带有multidb):
# 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
重申一下,第一次/初始迁移(和升级)效果很好。使用正确的迁移版本号正确更新了两个数据库上的alembic_version表。但是此后,当我们对模型进行任何更改并需要进行第二次迁移时,将不会创建新的迁移文件,并且会引发错误“未找到目标数据库”。
感谢帮助!
解决方法
我也遇到了同样的问题。当我使用IEnumerator DoScaleTex(Texture2D tex)
{
Texture2D scaled = new Texture2D(800,600,TextureFormat.RGB24,true);
Graphics.ConvertTexture(tex,scaled);
tex = scaled;
yield return new WaitForEndOfFrame();
}
应用一个数据库,而使用SQLALCHEMY_DATABASE_URI
应用另一个数据库,然后删除迁移和表时(未确认是否需要删除表),我的问题已解决。然后,它完美地选择了所有迁移,而没有错误SQLALCHEMY_BINDS
。我之前的代码:
Error: Target database is not up to date
和新代码:
SQLALCHEMY_BINDS = {
'central': POST_CONN_URI % POSTGRES_MAIN_DB_NAME,'tenant': POST_CONN_URI % 'demo_tenant'
}