在 Spring Boot 中测试时出现 SQL 语法错误

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

我有一个使用 PostgreSQL 和 Flyway 的 Spring Boot 项目。我想测试 UserRepository 所以我添加了一个 H2 数据库。这是用于测试的 application.properties 文件:

spring.datasource.url=jdbc:h2://mem:db;DB_CLOSE_DELAY=-1
spring.datasource.username=sa
spring.datasource.password=sa

spring.datasource.driver-class-name=org.h2.Driver

spring.jpa.hibernate.ddl-auto=create-drop
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
spring.jpa.properties.hibernate.format_sql=true

这是 UserRepository 代码:

@Repository
public interface UserRepository extends JpaRepository<UserEntity, Long> {

    Optional<UserEntity> findByEmail(String email);

    Optional<UserEntity> findByUsername(String username);
}

我为它创建了这样的测试:

@DataJpaTest
class UserRepositoryTest {

    @Autowired
    private UserRepository underTest;

    @Test
    void itShouldCheckThatUserExistsByEmail() {
        // given
        String email = "[email protected]";
        UserEntity user = new UserEntity(
                email,
                "12345678",
                "BobIsMe"
        );
        underTest.save(user);

        // when
        boolean expected = underTest.findByEmail(email).isPresent();

        // then
        assertTrue(expected);
    }

当我开始测试时,它失败并出现以下错误:

SQL State  : 42001
Error Code : 42001
Message    : Syntax error in expression SQL "CREATE TABLE IF NOT EXISTS customer\000d\000a(\000d\000a    id BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY (INCREMENT 1 [*]START 1),\000d\000a    email VARCHAR(50) NOT NULL,\000d\000a    password VARCHAR(20) NOT NULL,\000d\000a    username VARCHAR(30) NOT NULL\000d\000a)"; ожидалось "[, ., ::, AT, FORMAT, *, /, %, +, -, ||, NOT, IS, ILIKE, REGEXP, AND, OR, START WITH, RESTART, INCREMENT, MINVALUE, MAXVALUE, CYCLE, NO, EXHAUSTED, CACHE, )"
Syntax error in SQL statement "CREATE TABLE IF NOT EXISTS customer\000d\000a(\000d\000a    id BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY (INCREMENT 1 [*]START 1),\000d\000a    email VARCHAR(50) NOT NULL,\000d\000a    password VARCHAR(20) NOT NULL,\000d\000a    username VARCHAR(30) NOT NULL\000d\000a)"; expected "[, ., ::, AT, FORMAT, *, /, %, +, -, ||, NOT, IS, ILIKE, REGEXP, AND, OR, START WITH, RESTART, INCREMENT, MINVALUE, MAXVALUE, CYCLE, NO, EXHAUSTED, CACHE, )"; SQL statement:
CREATE TABLE IF NOT EXISTS customer
(
    id BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY (INCREMENT 1 START 1),
    email VARCHAR(50) NOT NULL,
    password VARCHAR(20) NOT NULL,
    username VARCHAR(30) NOT NULL
) [42001-224]
Location   : db/migration/V00001__Create_tables.sql (D:\university\SkyCast\skycast-repo\skycast_spring\target\classes\db\migration\V00001__Create_tables.sql)
Line       : 1
Statement  : CREATE TABLE IF NOT EXISTS customer
(
    id BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY (INCREMENT 1 START 1),
    email VARCHAR(50) NOT NULL,
    password VARCHAR(20) NOT NULL,
    username VARCHAR(30) NOT NULL
)

这是在我的 PostgreSQL 数据库中创建表的 SQL 脚本:

CREATE TABLE IF NOT EXISTS customer
(
    id BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY (INCREMENT 1 START 1),
    email VARCHAR(50) NOT NULL,
    password VARCHAR(20) NOT NULL,
    username VARCHAR(30) NOT NULL
);

CREATE TABLE IF NOT EXISTS customerCity
(
    customerId BIGINT NOT NULL,
    cityId BIGINT NOT NULL
);

CREATE TABLE IF NOT EXISTS customerHistory
(
    customerId BIGINT NOT NULL,
    requestId BIGINT NOT NULL
);

CREATE TABLE IF NOT EXISTS city
(
    id BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY (INCREMENT 1 START 1),
    name VARCHAR(50) NOT NULL
);

CREATE TABLE IF NOT EXISTS weather
(
    id BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY (INCREMENT 1 START 1),
    dateTime TIMESTAMPTZ NOT NULL,
    cityId INTEGER NOT NULL,
    climateData json NOT NULL
);
java sql spring-boot h2 flyway
1个回答
0
投票

由于现在您使用的是 H2 数据库而不是 PostgreSQL 数据库,请尝试将所有表中的主键列替换为

GENERATED ALWAYS AS IDENTITY
    

© www.soinside.com 2019 - 2024. All rights reserved.