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

Posted

技术标签:

【中文标题】如何将 Flyway 迁移与单个架构和多个项目一起使用【英文标题】:How can i use Flyway migration with single schema and multiple projects 【发布时间】:2018-09-20 02:12:23 【问题描述】:

如何管理处理相同数据库架构的多个项目。每个项目中的 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();
    

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

如何将相同的模式名“schema1”与 Flyway 一起用于 Project X 和 Y?


编辑: 感谢@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();

    

【问题讨论】:

关于你的第二个问题我不完全确定,但我相信baselineVersionAsString 应该是 谢谢,它适用于版本 0 没问题。为后代的解决方案添加了注释。 【参考方案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 应该

【讨论】:

谢谢它帮助了我。但我有一个以下问题,我已经编辑了我的帖子【参考方案2】:

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

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>*

【讨论】:

以上是关于如何将 Flyway 迁移与单个架构和多个项目一起使用的主要内容,如果未能解决你的问题,请参考以下文章

使用 Flyway 和 Spring Boot 迁移具有不同生命周期的多个模式

使用 Flyway 迁移存储过程

使用Flyway迁移存储过程

使用 Flyway 部署到多个模式

Flyway 迁移更新架构

Flyway - 多个 git 分支上的 SQL 迁移脚本版本