Spring 和 Flyway - 在应用程序上下文启动之前迁移
Spring and Flyway - migrate before application context starts up
如标题所示,我正在寻找任何可以帮助我 运行 在加载 Spring 应用程序上下文(准确地说是持久性上下文)之前迁移 Flyway 的方法。原因是我在应用程序启动时很少有 运行 的查询。这导致我的测试失败,因为正在对尚不存在的数据库表执行查询。我使用 H2 作为我的测试数据库。现在我只使用 flyway 核心依赖项:
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<version>6.5.0</version>
<scope>test</scope>
</dependency>
我有一个 Flyway 配置 class 如下:
@Configuration
class FlywayConfig {
private static final String resourcePath = "classpath:flyway/migrations";
private static final String sampleDataPath = "classpath:flyway/sample_data";
@Bean
Flyway flyway(@Value("${spring.datasource.url}") String dataSource,
@Value("${spring.datasource.username}") String username,
@Value("${spring.datasource.password}") String password) {
FluentConfiguration fluentConfiguration = Flyway.configure().dataSource(dataSource, username, password);
fluentConfiguration.locations(resourcePath, sampleDataPath);
Flyway flyway = fluentConfiguration.load();
return flyway;
}
}
并且属性在 application.yml
中定义
spring:
datasource:
username: sa
password: sa
url: 'jdbc:h2:mem:testdb;Mode=Oracle;IGNORE_CATALOGS=TRUE;DB_CLOSE_DELAY=-1;'
platform: h2
h2:
console:
enabled: true
jpa:
show-sql: true
我想要实现的是:1. flyway 执行迁移 2. Spring 上下文加载(按特定顺序)
我设法通过在配置文件中手动创建 DataSource
对象(而不是由 application.yml
自动创建 Spring)并使用 @DependsOn
来完成我想要的在 DataSource
对象上。通过这种方式,我确保一旦我在 Flyway
bean 中进行迁移(顺便说一句,我也进行了调整),就会建立来自应用程序上下文的任何可能的数据库连接。在测试之前我正在清理和迁移 Flyway,现在我必须在初始化应用程序上下文 bean 时执行此操作。这是对我有用的代码:
@Configuration
class DatabaseConfig {
private static final String resourcePath = "classpath:flyway/migrations";
private static final String sampleDataPath = "classpath:flyway/sample_data";
private static final String dataSourceUrl = "jdbc:h2:mem:testdb;Mode=Oracle;IGNORE_CATALOGS=TRUE;DB_CLOSE_DELAY=-1;";
private static final String username = "sa";
private static final String password = "sa";
@Bean("flyway")
public Flyway flyway() {
FluentConfiguration fluentConfiguration = Flyway.configure().dataSource(dataSourceUrl, username, password);
fluentConfiguration.locations(resourcePath, sampleDataPath);
Flyway flyway = fluentConfiguration.load();
flyway.clean();
flyway.migrate();
return flyway;
}
@DependsOn("flyway")
@Bean
public DataSource dataSource() {
DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
dataSourceBuilder.driverClassName("org.h2.Driver");
dataSourceBuilder.url(dataSourceUrl);
dataSourceBuilder.username(username);
dataSourceBuilder.password(password);
return dataSourceBuilder.build();
}
}
这里是 application.yml
文件(我去掉了与数据源相关的记录):
spring:
h2:
console:
enabled: true
jpa:
show-sql: true
flyway:
enabled: false
如标题所示,我正在寻找任何可以帮助我 运行 在加载 Spring 应用程序上下文(准确地说是持久性上下文)之前迁移 Flyway 的方法。原因是我在应用程序启动时很少有 运行 的查询。这导致我的测试失败,因为正在对尚不存在的数据库表执行查询。我使用 H2 作为我的测试数据库。现在我只使用 flyway 核心依赖项:
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<version>6.5.0</version>
<scope>test</scope>
</dependency>
我有一个 Flyway 配置 class 如下:
@Configuration
class FlywayConfig {
private static final String resourcePath = "classpath:flyway/migrations";
private static final String sampleDataPath = "classpath:flyway/sample_data";
@Bean
Flyway flyway(@Value("${spring.datasource.url}") String dataSource,
@Value("${spring.datasource.username}") String username,
@Value("${spring.datasource.password}") String password) {
FluentConfiguration fluentConfiguration = Flyway.configure().dataSource(dataSource, username, password);
fluentConfiguration.locations(resourcePath, sampleDataPath);
Flyway flyway = fluentConfiguration.load();
return flyway;
}
}
并且属性在 application.yml
spring:
datasource:
username: sa
password: sa
url: 'jdbc:h2:mem:testdb;Mode=Oracle;IGNORE_CATALOGS=TRUE;DB_CLOSE_DELAY=-1;'
platform: h2
h2:
console:
enabled: true
jpa:
show-sql: true
我想要实现的是:1. flyway 执行迁移 2. Spring 上下文加载(按特定顺序)
我设法通过在配置文件中手动创建 DataSource
对象(而不是由 application.yml
自动创建 Spring)并使用 @DependsOn
来完成我想要的在 DataSource
对象上。通过这种方式,我确保一旦我在 Flyway
bean 中进行迁移(顺便说一句,我也进行了调整),就会建立来自应用程序上下文的任何可能的数据库连接。在测试之前我正在清理和迁移 Flyway,现在我必须在初始化应用程序上下文 bean 时执行此操作。这是对我有用的代码:
@Configuration
class DatabaseConfig {
private static final String resourcePath = "classpath:flyway/migrations";
private static final String sampleDataPath = "classpath:flyway/sample_data";
private static final String dataSourceUrl = "jdbc:h2:mem:testdb;Mode=Oracle;IGNORE_CATALOGS=TRUE;DB_CLOSE_DELAY=-1;";
private static final String username = "sa";
private static final String password = "sa";
@Bean("flyway")
public Flyway flyway() {
FluentConfiguration fluentConfiguration = Flyway.configure().dataSource(dataSourceUrl, username, password);
fluentConfiguration.locations(resourcePath, sampleDataPath);
Flyway flyway = fluentConfiguration.load();
flyway.clean();
flyway.migrate();
return flyway;
}
@DependsOn("flyway")
@Bean
public DataSource dataSource() {
DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
dataSourceBuilder.driverClassName("org.h2.Driver");
dataSourceBuilder.url(dataSourceUrl);
dataSourceBuilder.username(username);
dataSourceBuilder.password(password);
return dataSourceBuilder.build();
}
}
这里是 application.yml
文件(我去掉了与数据源相关的记录):
spring:
h2:
console:
enabled: true
jpa:
show-sql: true
flyway:
enabled: false