You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SpringBoot单元测试用Liquibase操作H2数据库重命名列报错如何解决

问题原因

你遇到的报错核心是Liquibase执行列重命名变更时找不到目标列,具体根因如下:

  • 重命名变更集配置错误:你需要修改MSG_MONITORED_GRP表的MONITORED_GRP_ID列,但变更集中tableName属性错误写成了ALERT_WF,测试环境初始化H2数据库时并未创建ALERT_WF表,自然找不到对应列。
  • 配置缺失:
    1. Liquibase脚本中用到了${rec_owner}、${table_space_rec_data}等占位符,测试配置中未配置对应参数值
    2. H2默认模式不兼容Oracle语法(如你脚本中的VARCHAR2类型),会导致建表异常,间接引发后续列找不到的问题
解决方案

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 01:48:04