当前位置: 首页 > 知识库问答 >
问题:

Spring Boot+Hibernate+Flyway:不在新数据库上运行迁移

洪开济
2023-03-14

我正在使用Flyway更新DB模式。当前,模式的最新版本是3(最新的迁移文件名为v3__postgres.sql)。

我是否正确理解了baseline-version参数,还是遗漏了什么?

注意:我知道自Spring Boot2以来,参数名称空间已经更改为Spring.flyway.*,但我使用的是Spring Boot1,所以这不是问题。

共有1个答案

穆歌者
2023-03-14

解决方案:我创建了一个自定义的FlywayMigrationStrategybean,在这个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);
        }
    }

}
 类似资料:
  • 我正在尝试使用flyway,但是我有一个不知道如何解决的情况: 当我应用STANDARD脚本时,我必须运行V1.0__create_table_TAB1.sql当我将脚本应用到customer1时,TAB1表是一个视图,因此我必须运行V1.0__creaate_view_TAB1_to_schema1.sql。 实际: 应始终应用sql_common文件夹的脚本,但不应应用 V1.0(创建表 TA

  • 本文向大家介绍SpringBoot集成Flyway进行数据库版本迁移管理的步骤,包括了SpringBoot集成Flyway进行数据库版本迁移管理的步骤的使用技巧和注意事项,需要的朋友参考一下 Flyway简介 Flyway中的迁移(migrations)模式 Flyway对数据库的所有更改都称为 migrations(迁移) 。 migrations(迁移) 分为版本控制(Versioned)迁移

  • 我们正在尝试将迁移作为.sql文件置于版本控制之下。开发人员将编写一个vn__*.sql文件,提交到版本控制,并且每5分钟运行一次的作业将自动迁移到开发和测试数据库。一旦更改被证明没有引起问题,其他人就会运行一个手动作业来在生产上运行迁移。 我的问题: 我有一个演示迁移,创建了几个表。我将v4__demotable.sql检查到PC上的版本控制中。 阅读文档时,开发人员似乎建议我应该创建一个新的v

  • 每次更改DB结构时,我都使用时间戳创建一个新的迁移文件,以便按顺序执行,在一个干净的数据库中使用migrate命令(使用maven插件或命令行工具),它可以很好地工作,但在一个生产数据库中,使用相同的DB结构但添加了数据,我会得到以下错误:

  • 我试图在Spring Boot应用程序中使用Flyway对嵌入式H2数据库进行迁移演示。 应用程序.属性 迁移-db/migration下的脚本(V2__create_shipwreck.sql) 信息7284---[main]o.f.c.i.s.jdbctableSchemaHistory:创建架构历史记录表:“public”.“flyway_schema_history” 信息7284---[

  • 我正在用Cucumber编写验收测试,我想使用H2数据库进行测试。 应用程序测试属性如下所示: 在目录resources/db/migration中,我有一个包含这些脚本的sql文件: 但是当我运行测试时,H2用默认格式创建模式,而不是使用脚本: 如您所见,所有VARCHAR都是使用255大小创建的,而不是真实值。 你能帮我把飞行道和H2整合起来吗? 谢谢!