Как выполнить частичную миграцию в Flyway для тестирования?

#java #flyway

#java #flyway

Вопрос:

Я пытаюсь написать тест, чтобы проверить, правильно ли выполняется мой новый сценарий миграции (расположенный в src / main /resources / db / migration) для существующих данных в моей базе данных Postgres.

У меня есть 5 сценариев миграции, где 2-й создает исходную Users таблицу с несколькими столбцами, а 5-й добавляет в эту существующую 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
  

Ответ №1:

Вы ищете flyway.target опцию ( .target() в api). Смотрите https://flywaydb.org/documentation/commandline/migrate#target.

Этот параметр конфигурации задает версию для миграции. Итак, если у вас есть 3 миграции, V1__, v2__, v3__ используйте flyway.target=2 для миграции только V1__ и v2__ .

Ответ №2:

В конце я заменил

 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 , чтобы иметь эти два базовых пути