一尘不染

如何在单个架构和多个项目中使用Flyway迁移

sql

如何管理处理同一数据库模式的多个项目。如果每个项目中的Flyway迁移脚本被另一个项目修改,则不允许启动。

例如:

我有一个带有FlywayInitializer类的Spring Boot ProjectX。

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

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

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

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

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

项目结构:

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

如何在Flyway中为Project X和Y使用相同的架构名称“ schema1”?


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

第一个执行的项目X正确创建了表,但是如果启动了项目Y,则会出现错误: 找到没有元数据表的非空模式
。所以我必须将BaselineOnMigrate设置为true。但是,如果我将BaselineOnMigrate设置为true,则Project
Y跳过sql文件 V1.0_create_tableY.sql 并以 V1.1_update_tableY.sql开头
。我如何达到也为Project Y执行了第一个sql脚本V1.0_create_tableY.sql?

 @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();

    }

阅读 444

收藏
2021-03-08

共1个答案

一尘不染

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

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

    flyway.setSchemas("schema1");
    flyway.setLocations("classpath:x.migration");
    flyway.setTable("schema_version_y");
    flyway.migrate();
}

如果希望他们使用相同的版本控制方案,最好将所有SQL脚本放在单独的第三个项目中,或者更复杂的是,让第三个项目自动从主项目中收集和枚举SQL脚本,这可能会更好。


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

2021-03-08