我是 Java 和 Spring Boot 环境的新手(来自 Ruby on Rails)。我正在使用 Flyway 开发 Spring Boot 应用程序,在编写测试时我遇到了一个问题。我有一些 Postgres 特定的迁移(使用部分索引),因此它们在 H2 上运行时失败。我在网上搜索了跳过这些迁移的方法,但没有找到答案。
那么,有没有办法指定某些迁移仅在特定数据库类型上运行?
当我需要 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");
}
}
}