问题描述
我正试图编写一个测试来验证我的新迁移脚本(位于src / main / resources / db / migration中)是否对Postgres DB中的现有数据正确执行。
我有5个迁移脚本,其中第二个脚本创建带有一些列的初始Users
表,第五个脚本将新的列和该新列的默认值添加到现有的Users
表中。
首先,我只想迁移到脚本,以使Users
表的初始版本正常,然后将其填充,最后,通过运行第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
};
}
}
application-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
使其具有这两个基本路径