内存数据库中的 H2 在列名和我想使用的值之间感到困惑

Posted

技术标签:

【中文标题】内存数据库中的 H2 在列名和我想使用的值之间感到困惑【英文标题】:H2 in memory database is getting confused between column name, and the value I want to use 【发布时间】:2019-03-09 13:54:23 【问题描述】:

上下文:尝试测试一个spring boot应用,尝试通过src/test/resources/目录下的data.sql文件初始化数据

我在内存数据库中有以下内容:

spring.datasource.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false;

我还有下面的 SQL 表:

CREATE TABLE `roles` (
                       `id` bigint(20) NOT NULL AUTO_INCREMENT,
                       `name` varchar(60) DEFAULT NULL,
                       PRIMARY KEY (`id`),
                       UNIQUE KEY `UK_nb4h0p6txrmfc0xbrd1kglp9t` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

这是我的插入语句(在 data.sql 中)

INSERT INTO roles(name) VALUES ("ROLE_USER");

当我运行我的 spring 单元测试时,我得到了这个错误:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Initialization of bean failed; nested exception is org.springframework.jdbc.datasource.init.ScriptStatementFailedException: Failed to execute SQL script statement #2 of URL [file:/Users/me/IdeaProjects/proj/out/test/resources/data.sql]: INSERT INTO roles(name) VALUES ("ROLE_USER"); nested exception is org.h2.jdbc.JdbcSQLSyntaxErrorException: Column "ROLE_USER" not found; SQL statement:
INSERT INTO roles(name) VALUES ("ROLE_USER") [42122-198]

对我来说,一切看起来都是正确的......我正在使用一个简单的插入语句,在一个肯定存在的表上......我正在插入一个与列定义很好对应的值。但由于某种原因,它会抛出错误,说“ROLE_USER”列不存在,我不知道为什么。

【问题讨论】:

【参考方案1】:

啊!我找到了解决方案 - 结果表明 SQL 语句需要单引号作为值......所以正确的方法是:

INSERT INTO roles(name) VALUES ('ROLE_USER');

而不是:

INSERT INTO roles(name) VALUES ("ROLE_USER");

【讨论】:

以上是关于内存数据库中的 H2 在列名和我想使用的值之间感到困惑的主要内容,如果未能解决你的问题,请参考以下文章

与内存数据库中的同一个 H2 建立多个连接[重复]

将向量中的值粘贴到 R 中的列名

在同一应用程序中使用内存中的 H2 和 H2 文件

如何定义隐式列名的 H2 语法问题

如何关闭 h2 内存数据库?

内存数据库中的 H2:使用 JDBC 设置时区? Java 单元测试