flywayspringboot+java,新的本地数据库由hibernate创建,但现在migrate尝试应用已经发生的迁移

fykwrbwg  于 2021-07-23  发布在  Java
关注(0)|答案(3)|浏览(297)

我最初使用hibernate创建我的项目来创建表,就像大多数人一样,但后来我按照建议开始使用flyway来进行db迁移。
问题是我删除了包括db在内的整个本地系统,并试图再次旋转它,但我遇到了hibernate和flyway的冲突。
顺便说一下,我正在使用javaapi。所以当我在本地重建数据库时,我打开了 spring.jpa.hibernate.ddl-auto=${HIBERNATE_DDL:create} 只是第一次运行,然后将其转换为验证
所以它构建了所有的表,但现在当我尝试启动应用程序时,它将尝试运行第一个迁移,即 ALTER TABLE public.auth ADD COLUMN resent boolean 这将导致启动时出错,因为新列是由hibernate添加的

Error Code : 0
Message    : ERROR: column "resent" of relation "auth" already exists
Location   : db/migration/V1__Add_Resent_To_Auth.sql (/Users/brian/code/slap/build/resources/main/db/migration/V1__Add_Resent_To_Auth.sql)
Line       : 1
Statement  : ALTER TABLE public.auth
    ADD COLUMN resent boolean

那么我该如何告诉flyway当前的版本是v9,并且只在v9之后运行迁移呢。难道不应该看看flyway模式的历史,看看版本9是最后一个条目,然后再运行迁移吗?我一定错过了什么
我试着在配置中这样做,首先设置基线版本

@Configuration
class FlyWay() {

    @Value("\${spring.datasource.url}")
    lateinit var url: String

    @Value("\${spring.datasource.username}")
    lateinit var username: String

    @Value("\${spring.datasource.password}")
    lateinit var password: String

    @Bean
    fun migrate() {
        val flyway = Flyway.configure().baselineVersion("9.0").dataSource(url, username, password).load()
        flyway.migrate()
    }
}

没有这样的运气,它仍然试图运行v1
我也试着把它添加到application.properties spring.flyway.baselineVersion=9.0 同样的错误

kcrjzv8t

kcrjzv8t1#

我的理解是:
表已存在
表的状态对应于版本“9.0”
应为本地测试数据库设置一次flyway基线版本
通过命令行设置版本可能很有用,因为它只应用于测试数据库一次,然后应用正常的迁移策略。
文件见:https://flywaydb.org/documentation/usage/commandline/baseline
在macos上,flyway命令行客户端可以与 brew install flyway .
说明
确保删除表flyway\u schema\u history。使用首选sql客户端:

drop table flyway_schema_history;

然后使用flyway命令行客户端设置基线版本(本例使用postgres数据库):

flyway -user=stephan -password= -url=jdbc:postgresql://localhost:5432/stephan -baselineVersion="9.0" -locations="src/main/resources/db/migration" baseline

签入sql客户端:

select version from flyway_schema_history ;

现在应该显示“9.0”。之后,spring引导应用程序应该像往常一样工作。
测试

可供替代的
对于那些喜欢使用maven命令执行此操作的人:
如上图所示,删除表flyway\u schema\u history
使用命令 mvn flyway:baseline -Dflyway.baselineVersion="9.0" 设置基线版本
这需要在 pom.xml 文件,例如,如果使用postgres数据库:

<build>
    ...
    <plugins>
        ...
        <plugin>
            <groupId>org.flywaydb</groupId>
            <artifactId>flyway-maven-plugin</artifactId>
            <version>7.1.1</version>
            <configuration>
                <url>jdbc:postgresql://localhost:5432/stephan</url>
                <user>stephan</user>
            </configuration>
            <dependencies>
                <dependency>
                    <groupId>org.postgresql</groupId>
                    <artifactId>postgresql</artifactId>
                    <version>42.2.18</version>
                </dependency>
            </dependencies>
        </plugin>
    ...

用maven测试
快速测试也显示出同样的结果。

jw5wzhpr

jw5wzhpr2#

为什么不从数据库(由hibernate创建)导出sql脚本并将其作为第一个flyway脚本添加到应用程序中呢?这是最干净的解决方案,因为当应用程序在其他系统上运行时,不需要再次手动启动hibernate。

zz2j4svz

zz2j4svz3#

只需在application.yml spring.flyway.baseline-on-migrate中添加以下行后重试一次:true

相关问题