如何在使用Flyway的Java Spring Boot项目中根据条件或环境跳过迁移文件?

问题描述 投票:0回答:1

我是 Java 和 Spring Boot 环境的新手(来自 Ruby on Rails)。我正在使用 Flyway 开发 Spring Boot 应用程序,在编写测试时我遇到了一个问题。我有一些 Postgres 特定的迁移(使用部分索引),因此它们在 H2 上运行时失败。我在网上搜索了跳过这些迁移的方法,但没有找到答案。

那么,有没有办法指定某些迁移仅在特定数据库类型上运行?

java spring-boot database-migration flyway
1个回答
0
投票

当我需要 Java 迁移仅在 Postgres 上运行时,我最终创建了 Java 迁移。为此,我编辑了properties.properties文件以添加

spring.flyway.locations=classpath:db/migration,classpath:db/java

然后在我的 java/db/migration 中我为 postgres 创建了一个基类:

package db.migration;

import org.flywaydb.core.api.migration.BaseJavaMigration;
import org.flywaydb.core.api.migration.Context;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.Statement;

public abstract class PostgresBaseMigration extends BaseJavaMigration {
    @Override
    public void migrate(Context context) throws Exception {
        Connection connection = context.getConnection();
        DatabaseMetaData metaData = connection.getMetaData();
        String databaseProductName = metaData.getDatabaseProductName();
        String migrationName = getClass().getName();

        if ("PostgreSQL".equalsIgnoreCase(databaseProductName)) {
            execute(context);
        } else {
            System.out.println("Skipping " + migrationName + " migration because its not running on PostgreSQL");
        }
    }

    public abstract void execute(Context context) throws Exception;
}

然后我创建了从中扩展的仅 postgres 迁移。

package db.migration;

import org.flywaydb.core.api.migration.BaseJavaMigration;
import org.flywaydb.core.api.migration.Context;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.Statement;

public class V11__AddUniqueIndexes extends PostgresBaseMigration {
    @Override
    public void execute(Context context) throws Exception {
        try (Statement statement = context.getConnection().createStatement()) {
            System.out.println("Running V11__AddUniqueIndexes migration");
            statement.execute("CREATE UNIQUE INDEX IF NOT EXISTS unique_nome_categoria ON hub.categorias(nome) WHERE ativo = true");
            statement.execute("CREATE UNIQUE INDEX unique_nome_unidade ON hub.unidades(nome) WHERE ativo = true");
            statement.execute("CREATE UNIQUE INDEX unique_nome_item_dashboard ON hub.itens_dashboard(nome) WHERE ativo = true");
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.