Spring Boot 如果执行了所有以前的迁移,为什么Flyway不跳过基线迁移?

kb5ga3dv  于 2023-03-29  发布在  Spring
关注(0)|答案(1)|浏览(173)

我的项目中有超过250个迁移,都是在生产环境中执行的。所有的迁移都像这样V1_249__migration_nameV1_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,这样在一个空的数据库上运行它就很容易了。当我在空数据库上运行时,这完全可以正常工作。但是当我在已经执行了迁移的数据库上运行它时,它不会跳过基线迁移,而是执行它。我不明白到底发生了什么,这是预期的行为吗?如果不是,我做错了什么?如果是,我该怎么解决我遇到的问题

cig3rfwq

cig3rfwq1#

将其命名为B1__baseline,而不是V2_0__baseline。前缀Bn告诉Flyway将其视为基线脚本,其中包括n之前的所有迁移。它将仅在空数据库上执行。
请注意:基线不包括在免费版中。只包括在Flyway Teams中。

相关问题