如何在Flyway中做部分迁移进行测试?
How to do partial migration in Flyway for testing?
我正在尝试编写一个测试来验证我的新迁移脚本(位于 src/main/resources/db/migration)是否在我的 Postgres 数据库中的现有数据上正确执行。
我有 5 个迁移脚本,其中第 2 个创建带有一些列的初始 Users
table,第 5 个添加到现有的 Users
table 中新列和该新列的默认值。
首先,我想只迁移到脚本,以便 Users
table 的初始版本,然后我将正常填充它,最后,通过 运行 第 5 个脚本,然后检查第 5 个脚本是否实际更新了现有数据。但是,我不明白我如何才能只迁移到某个版本,然后再迁移到其余版本...
这是我目前的情况:
实际测试
@RunWith(SpringRunner.class)
@SpringBootTest
class MigrationTest extends ComponentTest {
private static final String USER_ID = "1337";
@Autowired
private InitialUserRepository initialUserRepository;
@Autowired
private UserRepository userRepository;
@Autowired
private Flyway flyway;
@Transactional
@Test
public void test() {
flyway.baseline(); // default 1
flyway.migrate(); // this will migrate to the final script/version where it will add the new column
// replace the above line, flyway.migrate(), with a partial migration to version 2 ONLY, something like flyway.migrate(2)
var initialUserMappingEntity = new InitialUserMappingEntity(USER_ID, "some other data");
initialUserRepository.saveAndFlush(initialUserMappingEntity);
var user = initialUserRepository.findById(USER_ID);
assertTrue(user.isPresent());
// complete the full migration here, something like flyway.migrate(5)
var updatedUser = userRepository.findById(USER_ID);
assertTrue(updatedUser.isPresent());
assertNotNull(updatedUser.get().getNewColumn());
}
}
EmptyMigrationStrategyConfig
@Configuration
public class EmptyMigrationStrategyConfig {
@Bean
public FlywayMigrationStrategy flywayMigrationStrategy() {
return flyway -> {
// do nothing
};
}
}
应用-test.yaml
spring:
flyway:
locations: classpath:/db/migration
您正在寻找 flyway.target
选项(api 中的 .target()
)。参见 https://flywaydb.org/documentation/commandline/migrate#target。
此配置参数设置要迁移到的版本。因此,如果您有 3 次迁移 V1__, v2__, v3__
使用 flyway.target=2
仅迁移 V1__
和 v2__
.
最后我更换了
var initialUserMappingEntity = new InitialUserMappingEntity(USER_ID, "some other data");
initialUserRepository.saveAndFlush(initialUserMappingEntity);
插入脚本位于:/db/testdata/V2.1__insert_user_data.sql
然后只做了一次迁移直到结束。
因此,您基本上需要在 /db/migration
中要测试的最终脚本之前添加一个插入脚本,然后修改 spring.flyway.locations
以具有这两个基本路径
我正在尝试编写一个测试来验证我的新迁移脚本(位于 src/main/resources/db/migration)是否在我的 Postgres 数据库中的现有数据上正确执行。
我有 5 个迁移脚本,其中第 2 个创建带有一些列的初始 Users
table,第 5 个添加到现有的 Users
table 中新列和该新列的默认值。
首先,我想只迁移到脚本,以便 Users
table 的初始版本,然后我将正常填充它,最后,通过 运行 第 5 个脚本,然后检查第 5 个脚本是否实际更新了现有数据。但是,我不明白我如何才能只迁移到某个版本,然后再迁移到其余版本...
这是我目前的情况:
实际测试
@RunWith(SpringRunner.class)
@SpringBootTest
class MigrationTest extends ComponentTest {
private static final String USER_ID = "1337";
@Autowired
private InitialUserRepository initialUserRepository;
@Autowired
private UserRepository userRepository;
@Autowired
private Flyway flyway;
@Transactional
@Test
public void test() {
flyway.baseline(); // default 1
flyway.migrate(); // this will migrate to the final script/version where it will add the new column
// replace the above line, flyway.migrate(), with a partial migration to version 2 ONLY, something like flyway.migrate(2)
var initialUserMappingEntity = new InitialUserMappingEntity(USER_ID, "some other data");
initialUserRepository.saveAndFlush(initialUserMappingEntity);
var user = initialUserRepository.findById(USER_ID);
assertTrue(user.isPresent());
// complete the full migration here, something like flyway.migrate(5)
var updatedUser = userRepository.findById(USER_ID);
assertTrue(updatedUser.isPresent());
assertNotNull(updatedUser.get().getNewColumn());
}
}
EmptyMigrationStrategyConfig
@Configuration
public class EmptyMigrationStrategyConfig {
@Bean
public FlywayMigrationStrategy flywayMigrationStrategy() {
return flyway -> {
// do nothing
};
}
}
应用-test.yaml
spring:
flyway:
locations: classpath:/db/migration
您正在寻找 flyway.target
选项(api 中的 .target()
)。参见 https://flywaydb.org/documentation/commandline/migrate#target。
此配置参数设置要迁移到的版本。因此,如果您有 3 次迁移 V1__, v2__, v3__
使用 flyway.target=2
仅迁移 V1__
和 v2__
.
最后我更换了
var initialUserMappingEntity = new InitialUserMappingEntity(USER_ID, "some other data");
initialUserRepository.saveAndFlush(initialUserMappingEntity);
插入脚本位于:/db/testdata/V2.1__insert_user_data.sql
然后只做了一次迁移直到结束。
因此,您基本上需要在 /db/migration
中要测试的最终脚本之前添加一个插入脚本,然后修改 spring.flyway.locations
以具有这两个基本路径