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

