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

Spring Boot测试UserRepository时出现SQL语法错误求助

解决H2与PostgreSQL IDENTITY语法兼容问题

快速修复:开启H2的PostgreSQL兼容模式

在测试环境的application.properties里给H2 URL加上兼容配置,让它模拟PostgreSQL的语法规则:

spring.datasource.url=jdbc:h2:mem:testdb;MODE=PostgreSQL;DATABASE_TO_LOWER=TRUE;DEFAULT_NULL_ORDERING=HIGH
spring.datasource.driver-class-name=org.h2.Driver

这样H2就能识别PostgreSQL风格的GENERATED BY DEFAULT AS IDENTITY语句,无需修改现有迁移脚本。

进阶方案:迁移脚本多数据库兼容

如果需要同时适配多种数据库,用Flyway的数据库特定语法块区分写法:

CREATE TABLE users (
    id BIGINT 
    /* PostgreSQL */ GENERATED BY DEFAULT AS IDENTITY 
    /* H2 */ AUTO_INCREMENT 
    PRIMARY KEY,
    username VARCHAR(50) NOT NULL UNIQUE,
    email VARCHAR(100) NOT NULL UNIQUE
);

Flyway会自动根据当前连接的数据库,执行对应注释块里的语法。

分离环境脚本

如果脚本差异较大,可按数据库类型拆分迁移脚本:

  • 在db/migration下放通用脚本
  • 新建db/migration/h2和db/migration/postgresql目录,分别存放对应数据库的专属脚本
    然后在配置中指定环境对应的脚本位置:
# 测试环境(H2)
spring.flyway.locations=classpath:db/migration,classpath:db/migration/h2
# 生产环境(PostgreSQL)
spring.flyway.locations=classpath:db/migration,classpath:db/migration/postgresql

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 07:52:21