Spring Boot从Java迁移Kotlin后Flyway迁移脚本执行失败
问题分析与解决方案
这个问题的核心是H2数据库的语法兼容性配置差异——你的Java版Spring Boot应用应该已经开启了H2的MySQL兼容模式,所以能识别INSERT IGNORE这种MySQL专属语法;但Kotlin版本的配置没跟上,导致Flyway执行脚本时H2直接抛出语法错误。
为什么会出现这种差异?
INSERT IGNORE是MySQL独有的语法,H2数据库默认的语法模式并不支持它。你的Java版本应用大概率在配置中给H2 URL添加了兼容模式参数,让H2可以解析这类MySQL风格的语句;而Kotlin版本的数据源配置遗漏了这个关键参数,才会出现"期望INTO"的语法报错。
具体解决步骤
修改H2数据库配置
在Kotlin版应用的application.properties或application.yml里,给H2的数据源URL加上MySQL兼容模式参数:- 若使用properties格式:
spring.datasource.url=jdbc:h2:mem:testdb;MODE=MySQL;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE - 若使用yml格式:
spring: datasource: url: jdbc:h2:mem:testdb;MODE=MySQL;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
重点是添加
;MODE=MySQL这个参数,让H2切换到MySQL兼容语法模式。- 若使用properties格式:
验证脚本执行
配置完成后重启应用,Flyway的INSERT IGNORE脚本应该就能像Java版本一样正常执行了,不需要修改迁移脚本内容。
额外补充
如果你的生产环境用的是MySQL,开发测试用H2模拟,这种兼容模式配置是很常规的做法,能避免数据库语法差异导致的测试环境与生产环境行为不一致的问题。
内容的提问来源于stack exchange,提问作者LittleBigUllah
相关产品推荐
相关产品推荐

