为使我们的应用程序具有一些背景知识,我们已经为应用程序中的现有端点配置了一个数据库。现在,有一个新要求,即向与不同数据库通信的同一应用程序添加端点。如此处的flask-sqlalchemy文档所述,为了使Flask-Migrate与多个数据库一起工作,我们删除了先前的迁移,在配置中添加了SQLALCHEMY_BINDS
,在模型中添加了bind_key
,并使用了以下命令; < / p>
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.
到目前为止,我们一直在尝试什么
原始配置(单个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表。但是此后,当我们对模型进行任何更改并需要进行第二次迁移时,将不会创建新的迁移文件,并且会引发错误“未找到目标数据库”。
感谢帮助!
答案 0 :(得分:1)
我也遇到了同样的问题。当我使用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'
}