【问题标题】:Flask Migrate for Multiple Database多个数据库的 Flask 迁移
【发布时间】: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.

到目前为止我们所尝试的,

  1. 已删除迁移文件夹。
  2. 重新运行 init-migrate-upgrade 循环。
  3. 确保所有 alembic 版本都同步(两个数据库中的 alembic 表,位于 repo 中)。
  4. 我们还尝试进行单个数据库迁移,并且成功了。不知何故,迁移多个数据库时似乎出现了问题。

原始配置(单个 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


    【解决方案1】:

    我也遇到了同样的问题。当我使用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'
        }
    

    和新代码:

    SQLALCHEMY_DATABASE_URI = POST_CONN_URI % POSTGRES_MAIN_DB_NAME
    SQLALCHEMY_BINDS = {
       'tenant': POST_CONN_URI % 'demo_tenant'
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-31
      • 2018-03-07
      • 2013-03-06
      • 1970-01-01
      • 2023-03-28
      • 2017-06-11
      • 2016-06-07
      • 2019-08-03
      相关资源
      最近更新 更多