SpringBoot单元测试用Liquibase操作H2数据库重命名列报错如何解决
问题原因
你遇到的报错核心是Liquibase执行列重命名变更时找不到目标列,具体根因如下:
- 重命名变更集配置错误:你需要修改
MSG_MONITORED_GRP表的MONITORED_GRP_ID列,但变更集中tableName属性错误写成了ALERT_WF,测试环境初始化H2数据库时并未创建ALERT_WF表,自然找不到对应列。 - 配置缺失:
- Liquibase脚本中用到了
${rec_owner}、${table_space_rec_data}等占位符,测试配置中未配置对应参数值 - H2默认模式不兼容Oracle语法(如你脚本中的
VARCHAR2类型),会导致建表异常,间接引发后续列找不到的问题
- Liquibase脚本中用到了
解决方案
1. 修正Liquibase变更集
将重命名列的变更集表名改为MSG_MONITORED_GRP,修正后代码如下:
<changeSet id="MSG_MONITORED_GRP::ALTER_MONITORED_GRP_NAME" author="sharakab"> <renameColumn catalogName="${rec_owner}" oldColumnName="MONITORED_GRP_ID" newColumnName="MONITORED_GRP_DISP_ID" columnDataType="VARCHAR2(200 CHAR)" tableName="MSG_MONITORED_GRP"/> <rollback> <renameColumn catalogName="${rec_owner}" oldColumnName="MONITORED_GRP_DISP_ID" newColumnName="MONITORED_GRP_ID" columnDataType="VARCHAR2(20 CHAR)" tableName="MSG_MONITORED_GRP"/> </rollback> </changeSet>
同时确认master_owner.xml中,建表变更集的执行顺序早于重命名列的变更集。
2. 补充测试配置参数
在application-test.properties中添加如下配置:
# 配置Liquibase占位符参数 spring.liquibase.parameters.rec_owner=PUBLIC spring.liquibase.parameters.table_space_rec_data= spring.liquibase.parameters.table_space_rec_index= # 开启H2 Oracle兼容模式,适配Oracle语法 spring.datasource.url=jdbc:h2:mem:test;MODE=Oracle;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false
3. 可选校验
如果还有异常,可在测试配置中添加spring.liquibase.show-sql=true,打印Liquibase执行的SQL语句,定位具体执行异常的步骤。
内容的提问来源于stack exchange,提问作者Akash Sharma
相关产品推荐
相关产品推荐

