【问题标题】:Run Flyway migrate with spring boot explicitly使用 Spring Boot 显式运行 Flyway 迁移
【发布时间】:2022-02-15 16:58:59
【问题描述】:

我有一个基于 Spring Boot 的应用程序,我想在其上运行 Flyway 迁移。该应用程序仅在某些情况下才需要运行 flyway 迁移。例如,如果“迁移”参数被传递给 Main()。

还有 2 个不同的数据源需要迁移。

@SpringBootApplication
public class ExampleMain implements CommandLineRunner {

    public static void main(String[] args) {
        new SpringApplicationBuilder(ExampleMain.class)
                                    .web(WebApplicationType.NONE)
                                    .run(args);
    }

    @Override
    public void run(String... args) throws Exception {
        if (args[0].equals("migrate"))
            migrate();
        else
            System.out.println("The world is round");
    }
    
    private void migrate() {
        createFlywayForDb1().migrate();
        createFlywayForDb2().migrate();
    }
    
    private Flyway createFlywayForDb1() {
        return createFlyway("XXX", "XXX", "XXX", new String[] { "classpath:com/example/migrations/db1" } );
    }
    private Flyway createFlywayForDb2() {
        return createFlyway("ZZZ", "ZZZ", "ZZZ", new String[] { "classpath:com/example/migrations/db2" } );
    }
    
    private Flyway createFlyway(String url, String userName, String userPassword, String[] locations) {
        return Flyway.configure()
                .dataSource(url, userName, userPassword)
                .locations(locations)
                .ignoreMissingMigrations(true)
                .ignoreIgnoredMigrations(true)
                .load();
    }
}

Flyway.migrate() 在这种情况下不起作用,因为 Java 迁移类需要注入它们的 Spring Boot bean。有什么方法可以自动加载 Flyway 实例吗?

我已阅读this,但找不到执行上述操作的方法。任何帮助将不胜感激!

【问题讨论】:

    标签: spring-boot flyway


    【解决方案1】:

    首先,您需要阻止 Spring Boot 在启动时执行 Flyway 迁移。如果你定义了一个实现 FlywayMigrationStrategy 的 bean,那么 Spring Boot 将调用该 bean,而不是直接调用 Flyway 来执行迁移。该实现不会实际执行迁移。

    @Bean
    public FlywayMigrationStrategy noopFlywayMigrationStrategy() {
      return flyway -> System.out.println("I'm not migrating right now.");
    }
    

    Spring Boot 自动配置一个 Flyway bean,您可以将其注入到您的应用程序中。调用该 bean 上的 migrate 方法来执行迁移。

    @SpringBootApplication
    public class ExampleMain implements CommandLineRunner {
    
      @Autowired
      private Flyway flyway;
        
      @Override
      public void run(String... args) throws Exception {
        if (args[0].equals("migrate")) {
          flyway.migrate();
        }
      }
    
      public static void main(String[] args) {
        new SpringApplicationBuilder(ExampleMain.class)
            .web(WebApplicationType.NONE)
            .run(args);
      }
    }
    

    【讨论】:

    • 感谢您提供非常有用的信息。我确实有 2 个需要迁移的数据源。我更新了示例以反映这一点。我认为注入的 flyway.migrate() 应该同时迁移,但我不确定。我会重新编码并试一试。
    猜你喜欢
    • 2019-08-07
    • 2018-08-16
    • 2018-10-07
    • 2020-08-20
    • 2020-02-09
    • 2019-02-06
    • 2020-12-31
    • 2016-12-12
    • 2018-07-29
    相关资源
    最近更新 更多