我的项目中有超过250个迁移,都是在生产环境中执行的。所有的迁移都像这样V1_249__migration_name
,V1_250__migration_name
......所以我创建了一个名为V2_0__baseline
的新迁移,它包含整个数据库的结构沿着一些插入。示例:
@Component
public class V2_0__baseline extends BaseJavaMigration {
private final ResourceLoader resourceLoader;
public V2_0__baseline(ResourceLoader resourceLoader) {
this.resourceLoader = resourceLoader;
}
@Override
public void migrate(Context context) throws Exception {
Resource resource = resourceLoader.getResource("classpath:baseline/baseline.sql");
Scanner scanner = new Scanner(resource.getInputStream(), StandardCharsets.UTF_8.name());
String sql = scanner.useDelimiter("\\A").next();
context.getConnection().createStatement().execute(sql);
}
}
这是我的飞行路线配置:
flyway:
out-of-order: true
enabled: true
baseline-version: 2.0
baseline-on-migrate: true
baseline-description: My baseline
想法是创建一种方法来支持在空数据库上运行迁移和在生产上运行迁移。一些旧的迁移存在一些问题,我们不能简单地在空数据库上运行迁移,这就是为什么我想创建一个包含所有结构的baseline,这样在一个空的数据库上运行它就很容易了。当我在空数据库上运行时,这完全可以正常工作。但是当我在已经执行了迁移的数据库上运行它时,它不会跳过基线迁移,而是执行它。我不明白到底发生了什么,这是预期的行为吗?如果不是,我做错了什么?如果是,我该怎么解决我遇到的问题
1条答案
按热度按时间cig3rfwq1#
将其命名为
B1__baseline
,而不是V2_0__baseline
。前缀Bn告诉Flyway将其视为基线脚本,其中包括n之前的所有迁移。它将仅在空数据库上执行。请注意:基线不包括在免费版中。只包括在Flyway Teams中。