gpt4 book ai didi

java - Spring Boot + Hibernate + Flyway : don't run migrations on new database

转载 作者:行者123 更新时间:2023-12-01 14:17:36 25 4
gpt4 key购买 nike

我正在使用 Flyway 更新数据库架构。目前,schema 的最新版本为 3(最新的迁移文件名为 V3__postgres.sql)。

如果我在具有较旧架构版本的数据库上运行应用程序,Flyway 会按预期执行更新脚本。但是,如果我在新的(空)数据库上运行应用程序,flyway 会尝试执行更新脚本,但它找不到任何表(因为 Hibernate 尚未创建它们),并且应用程序会因错误而终止。

我想要 Flyway 到 不是 在空数据库上执行更新脚本,因为当 Hibernate 创建表时,它们无论如何都将处于最新版本。

如果我理解正确,我应该可以使用参数 flyway.baseline-version为了这。我的理论是,如果 Flyway 没有找到表 schema_version ,它应该创建它并插入一条记录,说明数据库处于版本 3。但即使我设置了 flyway.baseline-version=3 , Flyway 无论如何都会执行脚本。我也尝试设置参数 flyway.baseline-on-migrate=true以及它们不同的组合,但我无法让它发挥作用。

我懂吗baseline-version参数正确还是我遗漏了什么?

注:我知道自 Spring Boot 2 以来,参数命名空间已更改为 spring.flyway.* ,但我使用的是 Spring Boot 1,所以这不是问题。

最佳答案

解决:我创建了一个自定义 FlywayMigrationStrategy bean,我手动检查 Flyway 是否已经引入数据库(通过检查迁移表是否存在)。如果没有,我运行 baseline命令。然后我调用 migrate像往常一样指挥。

这是 Spring Boot 配置:

import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.flyway.FlywayMigrationStrategy;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FlywayConfig {

@Autowired
private DataSource dataSource;

@Value("${flyway.table}")
private String flywayTableName;

@Value("${flyway.baselineVersionAsString}")
private String baselineVersion;

@Bean
public FlywayMigrationStrategy flywayMigrationStrategy() {
return flyway -> {
if (!isFlywayInitialized()) {
flyway.setBaselineVersionAsString(baselineVersion);
flyway.baseline();
}
flyway.migrate();
};
}

private boolean isFlywayInitialized() {

try (Connection connection = dataSource.getConnection()) {
DatabaseMetaData metadata = connection.getMetaData();
ResultSet result = metadata.getTables(null, null, flywayTableName, null);
return result.next();
} catch (SQLException e) {
throw new RuntimeException("Failed to check if Flyway is initialized", e);
}
}

}

关于java - Spring Boot + Hibernate + Flyway : don't run migrations on new database,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52117586/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com