如何使用单一架构和多个项目的Flyway迁移

时间:2018-04-10 12:39:33

标签: sql spring-boot flyway

如何管理处理相同数据库架构的多个项目。如果其他项目修改了项目,则每个项目中的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();
    }

我有一个子模块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 

我如何在项目X和Y中使用相同的schemaname" schema1"与Flyway?

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

第一个执行的项目X创建表格正确,但如果项目Y启动,我得到错误找到非空架构没有元数据表。所以我必须将BaselineOnMigrate设置为true。但是如果我将BaselineOnMigrate设置为true,则项目Y会跳过sql文件 V1.0_create_tableY.sql ,并以 V1.1_update_tableY.sql 开头。我怎样才能达到,第一个sql脚本V1.0_create_tableY.sql也是为Project 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();

    }

2 个答案:

答案 0 :(得分:4)

如果你能活两个完全独立生活的项目,那么#34>在同一模式中,您可以为这两个使用单独的版本表,即:

@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的脚本与基线匹配,并且应该已经执行。

答案 1 :(得分:0)

如果任何使用 Play 框架的人都可以通过为每个微服务使用独立的飞行路线历史表来解决这个问题,这意味着每个微服务都有自己的飞行路线历史表,根据服务的名称。这将为每个服务创建飞行表,在 conf 文件中添加这些属性以更改飞行表名称。

db.default.migration.table=microservice1    for 1 mircoservice
db.default.migration.table=microservice2    for 2 mircoservice

在每个微服务配置文件中添加此属性,这仅用于播放框架

如果使用 spring,那么我们使用 spring/flyway-db 配置,所以这只是将以下内容添加到 application.properties 除了第一个之外的每个项目。

flyway.table=schema_version_*<some_other_identifier>*