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

Postgresql Flyway在一个架构中有多个元数据表,postgresql,flyway,Postgresql,Flyway,我正在尝试使用Flyway对模块化应用程序的数据库进行版本设置。每个模块都有自己独立的一组表和迁移脚本,这些脚本将控制该组表的版本控制 Flyway允许我为每个模块指定不同的元数据表-这样我可以独立地对每个模块进行版本设置。当我尝试升级应用程序时,我为每个模块运行迁移过程,每个模块都有自己的表和脚本集。请注意,这些表都在同一个模式中 但是,当我尝试迁移我的应用程序时,第一次迁移是唯一有效的。后续迁移失败,出现以下异常:org.flywaydb.core.api.FlywayException:找

我正在尝试使用Flyway对模块化应用程序的数据库进行版本设置。每个模块都有自己独立的一组表和迁移脚本,这些脚本将控制该组表的版本控制

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

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

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


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

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

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

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

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

我们正在考虑使用另一个schema_版本表的类似方法来应用和记录无法干净地推广到每个环境的数据修复

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