如何在Flyway中进行部分迁移以进行测试?

问题描述

我正试图编写一个测试来验证我的新迁移脚本(位于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使其具有这两个基本路径