Spring Test @Sql执行PostgreSQL脚本时出现美元引号未终止错误
解决Spring Boot测试中PostgreSQL美元引号脚本执行失败问题
问题根源
Spring Boot的@Sql注解默认以分号(;)作为SQL语句分隔符,但PostgreSQL的DO $$ ... $$块内部包含分号,会被Spring提前拆分语句,导致DO块被拆成不完整片段,触发"未终止美元引号"的错误。
解决方案
1. 用简化SQL替代DO块(最简便)
原来的DO块逻辑可以直接用PostgreSQL原生的条件语法替代,完全等价且不会触发分隔符问题:
DROP SCHEMA IF EXISTS public CASCADE; CREATE SCHEMA public; -- 后续建表、插入数据语句正常写 CREATE TABLE food ( id SERIAL PRIMARY KEY, name VARCHAR(100) NOT NULL ); INSERT INTO food(name) VALUES ('Pizza'), ('Burger');
2. 自定义SQL语句分隔符
如果必须保留DO块,修改@Sql注解指定非分号的分隔符,同时同步修改脚本的语句结束标记:
测试类代码:
@SpringBootTest @Sql(scripts = "/setup-test-schema.sql", separator = "//") public class FoodE2eTest { // 测试方法实现 }
setup-test-schema.sql脚本:
DO $$ BEGIN IF EXISTS (SELECT 1 FROM pg_namespace WHERE nspname = 'public') THEN DROP SCHEMA public CASCADE; END IF; END $$// CREATE SCHEMA public;// CREATE TABLE food ( id SERIAL PRIMARY KEY, name VARCHAR(100) NOT NULL );// INSERT INTO food(name) VALUES ('Pizza'), ('Burger');//
验证
修改后重新运行FoodE2eTest,Spring会正确识别完整的SQL语句片段,Schema初始化流程可正常完成,不会再抛出美元引号相关错误。
内容的提问来源于stack exchange,提问作者Siim Karel Koger
相关产品推荐
相关产品推荐

