我最初使用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
同样的错误
3条答案
按热度按时间kcrjzv8t1#
我的理解是:
表已存在
表的状态对应于版本“9.0”
应为本地测试数据库设置一次flyway基线版本
通过命令行设置版本可能很有用,因为它只应用于测试数据库一次,然后应用正常的迁移策略。
文件见:https://flywaydb.org/documentation/usage/commandline/baseline
在macos上,flyway命令行客户端可以与
brew install flyway
.说明
确保删除表flyway\u schema\u history。使用首选sql客户端:
然后使用flyway命令行客户端设置基线版本(本例使用postgres数据库):
签入sql客户端:
现在应该显示“9.0”。之后,spring引导应用程序应该像往常一样工作。
测试
可供替代的
对于那些喜欢使用maven命令执行此操作的人:
如上图所示,删除表flyway\u schema\u history
使用命令
mvn flyway:baseline -Dflyway.baselineVersion="9.0"
设置基线版本这需要在
pom.xml
文件,例如,如果使用postgres数据库:用maven测试
快速测试也显示出同样的结果。
jw5wzhpr2#
为什么不从数据库(由hibernate创建)导出sql脚本并将其作为第一个flyway脚本添加到应用程序中呢?这是最干净的解决方案,因为当应用程序在其他系统上运行时,不需要再次手动启动hibernate。
zz2j4svz3#
只需在application.yml spring.flyway.baseline-on-migrate中添加以下行后重试一次:true