运行 Flyway 显式迁移 spring 启动

Run Flyway migrate with spring boot explicitly

我有一个 spring 基于启动的应用程序,我想要 运行 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 引导 bean。有什么方法可以自动加载 Flyway 实例吗?

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

首先,您需要停止 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 引导 auto-configures 一个 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);
  }
}