当前位置: 首页 > 知识库问答 >
问题:

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

田巴英
2023-03-14

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

例如:

我有一个带有FlywayInitializer类的spring boot项目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 

如何对项目X和Y使用与Flyway相同的schemaname“schema1”?

编辑:谢谢@jesper\u 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也为项目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个答案

焦同
2023-03-14

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

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

在每个microservice conf文件中添加此属性这仅用于播放框架

如果使用spring,那么我们使用的是spring/flyway db配置,所以这只是将以下内容添加到应用程序中。除第一个项目外,每个项目的属性。

flyway.table=schema_version_*<some_other_identifier>*
汪栋
2023-03-14

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

@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应该是

 类似资料:
  • 我有一个关于Flyway DB迁移的问题。如何管理处理同一数据库模式的多个项目(微服务)。如果每个项目中的Flyway移植脚本被其他项目修改,则不允许启动该脚本。他们是否有相关的文档或最佳实践?

  • 问题内容: 如何管理处理同一数据库模式的多个项目。如果每个项目中的Flyway迁移脚本被另一个项目修改,则不允许启动。 例如: 我有一个带有FlywayInitializer类的Spring Boot ProjectX。 我有一个子模块Project Y,也有他自己的FlywayInitializer类 项目结构: 如何在Flyway中为Project X和Y使用相同的架构名称“ schema1”

  • 我对Flyway完全陌生,但我正在尝试使用https://github.com/flyway/flyway-docker描述的docker-compose flyway mysql安排来迁移许多相同的测试数据库 据我所知,< code>migrate命令可以在它的< code>-schemas参数中接受多个模式,但是它似乎只将实际的SQL迁移应用于列表中的第一个模式。 例如,当我使用< code>

  • 我可以强制Flyway在一个事务中运行所有尚未应用的迁移,而不是让每个迁移都是自己的事务吗? 在开发环境中这不是一个问题,但是在生产环境中,您可能会执行从一个更新到下一个更新的多个迁移,其中一个迁移失败将使数据库处于“半迁移”状态,其中一些迁移已提交,而一些未提交--这是一件非常糟糕的事情。 一种解决方法是简单地将所需的所有SQL塞进一个文件中,但这样做存在一些问题:

  • 我已经学会了我可以使用参考文献来实现这一点。但是,当我将一个ref与几个TextInputs一起使用时,我只与最后一个TextInputs一起使用

  • 我正在试用flyway,对类路径和JAR有一个理解问题。 我有一个在多个maven模块中包含多个服务的项目。我希望每个服务都使用flyway维护其模式。因此,每个服务都是一个maven模块,具有自己的资源目录,我可以在其中放置SQL脚本,这将是JAR的一部分。现在,服务可以在嵌入式模式下运行,在嵌入式模式下,终端用户应用程序(例如tomcat)中存在多个服务JAR。 在服务初始化时,我会使用每个服