使用 Spring 从自定义 sql 加载 H2 源数据

Load H2 source data from custom sql with Spring

Spring 中的 H2 设置有问题。我将所有 sql 数据放入一个名为 data.sql 的文件中,但是当我将其更改为其他任何文件时 - 它无法被识别。知道如何设置多个单独的文件吗?

假设我有一个 table 用户并插入了一些数据,但目标是有 2 个单独的文件,例如user-schema 和 user-data,等等 - 具有相同数量插入数据文件的多个模式文件。

我目前的 spring.properties 看起来如下:

spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect
spring.h2.console.enabled=true
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=create-drop
spring.h2.console.path=/h2

我目前的 data.sql 看起来如下:

DROP TABLE IF EXISTS User;

CREATE TABLE User
(
    id      INT AUTO_INCREMENT PRIMARY KEY,
    name    VARCHAR(20) NOT NULL,
    surname VARCHAR(20) NOT NULL,
    role    VARCHAR(20) NOT NULL,
    email   VARCHAR(30) NOT NULL
);

INSERT INTO User (name, surname, role, email)
VALUES ('Thor', '', 'admin', 'thor@marvel.com'),
       ('Hulk', '', 'user', 'hulk@marvel.com'),
       ('Venom', '', 'user', 'venom@marvel.com'),
       ('Spider', 'Man', 'user', 'spider-man@marvel.com'),
       ('Super', 'Man', 'user', 'super-man@marvel.com');

如果您想将数据输入分离到多个文件中,您应该向 Spring 提供有关文件位置的信息:

spring.datasource.data=classpath*:sql/mock-*.sql
spring.datasource.initialization-mode=always

在我的项目中,我们将 .sql 文件保存在 resource/sql 文件夹中,每个文件名 mock-*.sql,如 mock-user.sql,mock- role-.sql 这就是我在路径中使用通配符的原因。无论如何,在 spring.datasource.data 中,您必须提供带有 sql 插入的文件路径。

spring.datasource.initialization-mode=always 告诉 Spring 始终从文件初始化数据库。您应该配置 属性 因为每次测试开始时您 "create-drop" 数据库。

Spring 有关数据和模式初始化的文档:https://docs.spring.io/spring-boot/docs/2.1.x/reference/html/howto-database-initialization.html