使用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
相关产品推荐
相关产品推荐

