Spring 测试 @Sql 抛出“未终止的美元报价开始......预计终止 $$”

问题描述 投票:0回答:1

我正在使用测试类 (FoodE2eTest) 测试我的 Spring Boot API,并且我有一个单独的 SQL 脚本文件 (setup-test-schema.sql),我想在测试开始之前运行该文件以设置架构、表和数据.

我正在使用 PostgreSQL

问题

当我单独运行该文件时,它工作正常,但是当我运行测试类时,我收到以下错误:“

未终止的美元报价从 SQL DO $$ BEGIN IF 中的位置 3 开始 EXISTS (SELECT 1 FROM pg_namespace WHERE nspname = 'public') THEN DROP 架构公共级联。预计终止 $$

配置文件

...
spring.datasource.url=jdbc:postgresql://localhost:5432/testdb
spring.datasource.username=testuser
spring.datasource.password=testpass
spring.datasource.driver-class-name=org.postgresql.Driver
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.maximum-pool-size=10
spring.datasource.hikari.minimum-idle=5
...

测试课

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@TestPropertySource(locations = "/application-test.properties")
@AutoConfigureMockMvc
@Sql(scripts = {"/migration/setup-test-schema.sql"}, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD)
public class FoodE2eTest {
...
}

SQL 文件

-- drop everything
DO
$$
    BEGIN
        IF EXISTS (SELECT 1 FROM pg_namespace WHERE nspname = 'public') THEN
            DROP SCHEMA public CASCADE;
        END IF;
    END
$$;

CREATE SCHEMA public;
GRANT ALL ON SCHEMA public TO postgres;
GRANT ALL ON SCHEMA public TO public;
GRANT ALL ON SCHEMA public TO testuser;


-- create tables
CREATE TABLE public.user(

...

问题依然存在

  1. 当我指定语言时没有任何更改。
DO
$$
BEGIN
    IF EXISTS (SELECT 1 FROM pg_namespace WHERE nspname = 'public') THEN
        DROP SCHEMA public CASCADE;
    END IF;
END;
$$ LANGUAGE PLPGSQL;
  1. 当我将 @Sql 注释移至方法级别时。
postgresql plpgsql spring-test spring-boot-test
1个回答
0
投票

找到了解决方案,但我不知道它为什么有效。我猜Spring框架测试环境不支持双美元符号。

通过此更改修复

-- drop everything
DO
'
BEGIN
    IF EXISTS (SELECT 1 FROM pg_namespace WHERE nspname = ''public'') THEN
        DROP SCHEMA public CASCADE;
    END IF;
END;
' LANGUAGE PLPGSQL;

CREATE SCHEMA public;
GRANT ALL ON SCHEMA public TO postgres;
GRANT ALL ON SCHEMA public TO public;
GRANT ALL ON SCHEMA public TO testuser;


-- create tables
CREATE TABLE public.user
(
© www.soinside.com 2019 - 2024. All rights reserved.