Flask迁移到多个数据库

时间:2020-08-26 22:40:57

标签: python flask flask-sqlalchemy alembic flask-migrate

为使我们的应用程序具有一些背景知识,我们已经为应用程序中的现有端点配置了一个数据库。现在,有一个新要求,即向与不同数据库通信的同一应用程序添加端点。如此处的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.

到目前为止,我们一直在尝试什么

  1. 删除了迁移文件夹。
  2. 重新运行init-migrate-upgrade周期。
  3. 确保所有的alembic版本都处于同步状态(两个数据库中的alembic表,都位于回购中)。
  4. 我们还尝试了一次数据库迁移,并且成功了。迁移多个数据库时似乎有点问题。

原始配置(单个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表。但是此后,当我们对模型进行任何更改并需要进行第二次迁移时,将不会创建新的迁移文件,并且会引发错误“未找到目标数据库”。

感谢帮助!

1 个答案:

答案 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'
    }