当前位置: 首页 > 知识库问答 >
问题:

Flyway在一个架构中有多个元数据表

韦高格
2023-03-14

我试图使用Flyway来版本模块化应用程序的数据库。每个模块都有自己独立的表集和迁移脚本,这些脚本将控制该表集的版本控制。

Flyway允许我为每个模块指定不同的元数据表——这样我就可以独立地版本每个模块。当我尝试升级应用程序时,我为每个模块运行一个迁移过程,每个模块都有自己的表和一组脚本。请注意,这些表都在同一个架构中。

但是,当我尝试迁移我的应用程序时,第一次迁移是唯一有效的。后续迁移失败,出现以下异常:org。flywaydb。果心应用程序编程接口。FlywayException:找到不带元数据表的非空架构“public”!使用baseline()或将baselineOnMigrate设置为true来初始化元数据表

如果我手动为每个模块创建元数据表,每个模块的迁移都会正常工作。自己创建表而不是让Flyway为我创建表似乎是解决问题的黑客手段,而不是解决方案本身。

这是独立管理多组表的有效方法,还是有更好的方法?自己创建元数据表是一种有效的方法吗?


共有2个答案

司徒焕
2023-03-14

我认为您需要在执行迁移之前对每个模块进行基线检查。您需要传递table选项来覆盖每个模块的schema_版本,例如flyway。table=schema\u version\u module1。正如错误消息所提示的,您也可以baselineOnMigrate,但文档中会对此提出警告(https://flywaydb.org/documentation/commandline/migrate).

我们正在考虑一种类似的方法,使用另一个schema_version表来应用和记录不能干净地推广到每个环境的数据修复。

贺高飞
2023-03-14

理想的解决方案是将模块拆分为模式。这为每个模块提供了一个有效的隔离单元,也很适合模块化应用程序(模块完全隔离和自我管理),而不是将所有内容都转储到单个模式(尤其是公共模式)。如

application_database
    ├── public
    ├── module_1
    │   ├── schema_version
    │   ├── m1_t1
    │   └── m1_t2
    ├── module_2
    │   ├── schema_version
    │   ├── m2_t1
    │   └── m2_t2
    ...

第二种选择是继续使用公共模式来承载所有表,但对每个schema\u版本使用单独的模式。这是较少的重构工作,但肯定是一个不太优雅的设计比上述提到的。如

application_database
    ├── public
    │   ├── m1_t1
    │   ├── m1_t2
    │   ├── m2_t1
    │   └── m2_t2
    ├── module_1
    │   └── schema_version
    │
    ├── module_2
    │   └── schema_version
    ...

 类似资料:
  • <代码>找到非空架构“public”,没有元数据表!使用init()或将initOnMigrate设置为true来初始化元数据表 我正在使用Postgres 9.2和Postgis 2.0。这意味着在默认情况下,当我创建新数据库时,将在名为spatial\u ref\u sys的模式中创建一个表 当我在这个数据库上运行flyway migrate时,我得到了上面的错误。运行init似乎创建了pub

  • 问题内容: 如何管理处理同一数据库模式的多个项目。如果每个项目中的Flyway迁移脚本被另一个项目修改,则不允许启动。 例如: 我有一个带有FlywayInitializer类的Spring Boot ProjectX。 我有一个子模块Project Y,也有他自己的FlywayInitializer类 项目结构: 如何在Flyway中为Project X和Y使用相同的架构名称“ schema1”

  • 问题内容: 我正在使用Spring Boot。我终于设法设置了两个数据源,但是现在我面临另一个问题。 有两个数据源的地方似乎无法在我的Spring Boot应用程序中工作,请立即执行此操作 我无法为每个数据源选择自动创建策略。我宁愿为数据源一创建模式,而仅在第二个DB中使用数据源为二的模式。 任何机构都知道如何解决这些问题?注意如果可能的话,我不想完全放弃自动配置。我什至还不知道,hibernat

  • 当我说 table.drop() / metadata.drop_all() sqlacalchemy是否支持alter table、create view、create trigger、schema升级功能? 如何根据表对象的依赖关系对其排序? 如何以字符串形式获取创建表/删除表输出? 我如何子类表/列以提供某些行为/配置? 当我说 table.drop() / metadata.drop_al

  • 问题内容: 我在使用JPA / Spring遇到一个特定问题时遇到了一些麻烦: 如何为实体动态分配架构? 我们有属于模式AD的TABLE1和位于BD下的TABLE2。 架构可能不会在注释属性中进行硬编码,因为它取决于环境(Dev / Acc / Prd)。(接受的模式是S1A和S2A) 我该如何实现?是否可以指定这样的占位符: 以便根据驻留在环境中的属性文件替换架构? 干杯 问题答案: 我有一个相

  • 问题内容: 我想执行一个查询,该查询从与数据库连接中指定的模式不同的模式中选择数据(相同的Oracle服务器,相同的数据库,不同的模式) 我有一个与Oracle服务器通信的python应用程序。它打开与数据库(服务器/架构)A的连接,并对数据库中的表执行选择查询。 我尝试了以下方法: 但我得到: 我还尝试用括号将模式名称括起来: 我得到: 使用Django应用程序内部的cx_Oracle pyth