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