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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 12:14:52