当前位置: 首页 > 面试题库 >

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

爱刚捷
2023-03-14
问题内容

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

    }

问题答案:

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

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



 类似资料:
  • 如何管理处理相同数据库模式的多个项目。如果被另一个项目修改,每个项目中的Flyway迁移脚本不允许启动。 例如: 我有一个带有FlywayInitializer类的spring boot项目X。 我有一个子模块Y,还有他自己的FlywayInitializer类 项目结构: 如何对项目X和Y使用与Flyway相同的schemaname“schema1”? 编辑:谢谢@jesper\u bk对我的帮

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

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

  • 问题内容: 用于登录的配置文件可以在类路径中找到,因此是Eclipse项目特定的,这不是我想要的。我正在使用多个Java实用程序,它们全部都驻留在一个项目中(共享类路径),并且其中一些需要使用特定的配置。 我尝试了变量替换和Joram配置器,但没有任何效果。这很可能是我的错,我有一天要解决,但是现在我需要一个简单的解决方案。 问题答案: 选项1:使用logback.configurationFil

  • 我已成功地将spring boot配置为使用Flyway的新项目 随Postgres数据库从版本0001.0迁移到0008.0 我已在本地手动更改脚本,但flyway迁移失败。 错误消息示例: 注意:-我不想从表flyway_schema_history中删除脚本条目。

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