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

使用nkonev r2dbc-migrate+H2测试时遇重复列名错误求助

H2数据库配合r2dbc-migrate锁表报错的解决办法

问题根因

你碰到的重复列名错误,本质是H2在PostgreSQL兼容模式下的特性导致的:H2会给select 1, false这种未命名的子查询列统一命名为?column?,而r2dbc-migrate默认生成的锁表初始化语句用了这种匿名列写法,两个列重名就触发了语法异常。PostgreSQL本身允许匿名列存在,所以生产环境用PG完全没问题。

可行解决方案

1. 手动编写锁表初始化脚本

在你的迁移脚本目录下新建一个初始化脚本(比如V1__init_lock_table.sql),显式给子查询的列命名,避免H2自动生成重复列名:

CREATE TABLE IF NOT EXISTS migrations_lock (
    id INTEGER PRIMARY KEY,
    locked BOOLEAN NOT NULL
);

INSERT INTO migrations_lock(id, locked)
SELECT * FROM (SELECT 1 AS id, FALSE AS locked) x
WHERE NOT EXISTS(SELECT * FROM migrations_lock);

2. 优化H2连接参数

在原连接串里追加两个参数,避免H2对标识符大小写的额外处理问题:

r2dbc:h2:mem:///testdb?options=MODE=PostgreSQL;DATABASE_TO_LOWER=TRUE;CASE_INSENSITIVE_IDENTIFIERS=TRUE

3. 升级r2dbc-migrate版本

如果你用的是较早版本的r2dbc-migrate,升级到最新稳定版(比如1.8.x及以上),新版本大概率已经修复了H2兼容模式下的锁表语句问题。

验证流程

  • 替换或添加自定义的锁表初始化脚本
  • 更新H2的连接串参数
  • 重启测试项目,观察数据库迁移是否正常执行

内容的提问来源于stack exchange,提问作者hormunkul

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 10:20:25