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

FlyWay+Spring Boot2.x用于特定于供应商的脚本错误:发现多个版本1.x的迁移

马胜泫
2023-03-14

我正在尝试配置FlyWay与两个供应商一起工作--一个(H2)用于本地环境,另一个(Mysql)用于CI。

这是我的脚本补丁:

我的FlyWay bean配置:

@Bean(initMethod = "migrate")
    Flyway flyway() {
        Flyway flyway = Flyway
                .configure()
                .dataSource(dataSource(dataSourceProperties()))
                .locations("classpath:db/migration/MySQL", "classpath:db/migration/H2")
                .load();
        return flyway;
    }

    @Bean
    @Primary
    @ConfigurationProperties("spring.datasource")
    public DataSourceProperties dataSourceProperties() {
        return new DataSourceProperties();
    }

    @Bean
    @ConfigurationProperties("spring.datasource")
    public HikariDataSource dataSource(DataSourceProperties properties) {
        return properties.initializeDataSourceBuilder().type(HikariDataSource.class)
                .build();
    }
spring:
  main:
    allow-bean-definition-overriding: true
  datasource:
    driverClassName: com.mysql.cj.jdbc.Driver
    jdbc-url: jdbc:mysql://localhost:3306/messages
    username: username
    password: password
Caused by: org.flywaydb.core.api.FlywayException: Found more than one migration with version 1.1
Offenders:
-> C:\Projects\my-project\out\production\resources\db\specific\MySQL\V1_1__Create_table_message.sql (SQL)
-> C:\Projects\my-project\out\production\resources\db\specific\H2\V1_1__Create_table_message.sql (SQL)

我已经尝试使用小写的供应商名称(db/migration/mysql...)并使用db/specific/而不是db/migration。对我没什么用。

共有1个答案

魏高邈
2023-03-14

问题是您使用了:

.locations("classpath:db/migration/MySQL", "classpath:db/migration/H2")

这会将两个迁移都添加到运行时路径中。这就是导致问题的原因,因为该配置指示flyway始终使用来自两个位置的脚本,而不是只使用H2脚本用于H2和MySQL脚本用于MySQL。

相反,您应该只在路径上添加活动驱动程序的特定路径。

类似于

String driverVendor = ..; // something to decide h2 or mysql
Flyway flyway = Flyway
        .configure()
        .locations("classpath:db/migration/" + driverVendor)

您可能需要将文件夹名小写,即h2改为h2mysql改为mysql

或者,考虑使用Spring Boots Flyway自动配置,而不是在代码中编码Flyway配置。这允许您在应用程序配置中将路径定义为:

spring.flyway.locations=classpath:db/migration/{vendor}

其中{vendor}将自动填充用于连接的驱动程序的供应商名称。

另请参见启动时执行Flyway数据库迁移

 类似资料:
  • 在该项目中,我们使用Flyway迁移工具来开发数据库模式以及这些脚本的git历史。 这个想法是每个脚本编号都以number为前缀,增加值10,然后是名称,例如: 0000_name_one。sql 0010_name_two。sql 0020_name_tree.sql 等 但是,由于我们必须开始处理多个分支(例如,两个主要分支是:主master_ext),再加上我们有一些用于耗时功能的开发分支

  • 我用试用密钥尝试了State/BaselineMigration功能。https://flywaydb.org/documentation/concepts/baselinemigrationsFlyWay迁移执行脚本并正确移动到正确的版本。但在此基础上运行的所有迁移都失败了 从S开始2__xxx.sql然后它在版本2的模式表中创建一行并键入"SQL_STATE_SCRIPT" 再次执行flywa

  • 我已经从1.3更新了Spring启动版本。5至1.4。0,我得到以下错误 使用Camunda BPM,版本为Spring Boot:(v1.4.0.发行版)Camunda BPM:(v7.5.0)Camunda BPM Spring Boot Starter:(v1.2.1) 对卡蒙达的依赖, 对于包装,我们使用以下插件, 请让我知道从1.3. x更新到1.4.0Spring引导失败的原因

  • 问题内容: 我目前在Mac上安装了多个版本的Python,一个版本是与它一起提供的,一个是我最近从python.org下载的版本,一个用于在本地运行Zope的旧版本,另一个是Appengine正在使用的版本。有点混乱。有任何建议使用一个版本的python来统治它们吗?我将如何处理已删除的旧版本,并将所有应用程序链接到一个安装中。我应该知道的Mac特定陷阱吗?这是一个愚蠢的主意吗? 问题答案: 拥有

  • 我得到了一个现有的项目,目前使用flyway-ant,版本2.2.1进行迁移。 出于多种原因,我需要使用 3.2.1(修复不同行尾的表)。不幸的是,一旦我尝试使用flyway 3.2.1设置一个空的测试数据库,我从Oracle DB收到以下错误: 任何想法为什么会发生这种情况?这可能是飞行途中的错误吗?使用飞行路线 2.2.1 运行迁移一切正常,运行与飞行路线 3.2.1 完全相同的迁移,orac

  • 问题内容: 如何在MacOS上安装其他Java?我安装了jdk8,效果很好。但现在出于开发目的,我需要安装jdk7。当尝试通过DMG文件安装旧版本时,我得到警告,已经安装了较新版本的Java,并且安装程序退出。 除此以外,如何安装jdk7? 问题答案: 在Mac上管理多个Java版本的最干净方法是使用。 在内Homebrew,使用: homebrew-cask 安装Java版本 jenv 管理Ja