我如何将 Flyway 迁移用于单个架构和多个项目

jav*_*ava 3 sql flyway spring-boot

如何管理处理相同数据库架构的多个项目。每个项目中的 Flyway 迁移脚本如果被其他项目修改,则不允许启动。

例如:

我有一个带有 FlywayInitializer 类的 Spring Boot Project X。

   @PostConstruct
    public void migrateFlyway() {
        final Flyway flyway = new Flyway();

        flyway.setSchemas("schema1");
        flyway.setLocations("classpath:x.migration");
        flyway.migrate();
    }
Run Code Online (Sandbox Code Playgroud)

我有一个子模块 Project Y 和他自己的 FlywayInitializer 类

   @PostConstruct
    public void migrateFlyway() {
        final Flyway flyway = new Flyway();

        flyway.setSchemas("schema1");
        flyway.setLocations("classpath:y.migration");
        flyway.migrate();
    }
Run Code Online (Sandbox Code Playgroud)

项目结构:

Project X
    src
      |
      main
          |
           java 
                FlywayInitializerX.java 
          |
           resources
               V1.0_create_tableX.sql
               V1.1_update_tableX.sql 

Project Y 
    src
      |
      main
          |
           java 
                FlywayInitializerY.java 
          |
            resources
               V1.0_create_tableY.sql 
               V1.1_update_tableY.sql 
Run Code Online (Sandbox Code Playgroud)

我如何为项目 X 和 Y 使用与 Flyway 相同的架构名称“schema1”?


编辑: 感谢@jesper_bk 帮助了我。这正是我想要的,这两个项目在同一架构中具有完全“独立的生活”。但现在我有以下问题:

第一个执行的项目 X 创建表正确,但如果项目 Y 启动,我会收到错误Found non-empty schema without metadata table。所以我必须将 BaselineOnMigrate 设置为 true。但是,如果我将 BaselineOnMigrate 设置为 true,则项目 Y 将跳过 sql 文件V1.0_create_tableY.sql并从V1.1_update_tableY.sql开始。我怎样才能达到,第一个 sql 脚本 V1.0_create_tableY.sql 也为项目 Y 执行?

 @PostConstruct
    public void migrateFlyway() {
        final Flyway flyway = new Flyway();

        flyway.setBaselineVersionAsString("1");
        flyway.setBaselineOnMigrate(true);

        flyway.setSchemas("schema1");
        flyway.setLocations("classpath:y.migration");
        flyway.migrate();

    }
Run Code Online (Sandbox Code Playgroud)

jes*_*_bk 5

如果您可以在同一架构中使用两个具有完全“独立生活”的项目,则可以为这两个项目使用单独的版本表,即:

@PostConstruct
public void migrateFlyway() {
    final Flyway flyway = new Flyway();

    flyway.setSchemas("schema1");
    flyway.setLocations("classpath:x.migration");
    flyway.setTable("schema_version_y");
    flyway.migrate();
}
Run Code Online (Sandbox Code Playgroud)

如果您希望它们使用相同的版本控制方案,您可能最好将所有 SQL 脚本放在单独的第三个项目中,或者 - 甚至更复杂 - 拥有一个自动收集和枚举主项目中的 SQL 脚本的第三个项目。


关于你的第二个问题,baselineVersionAsString应该 < 1(例如 0)。如果基线版本为 1,它将确定您的第一个版本为 1.0 的脚本与基线匹配,并且应该已经被执行。