运行 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);
}
}
我有一个 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);
}
}