内存 H2 数据库,插入脚本不持久

Posted

技术标签:

【中文标题】内存 H2 数据库,插入脚本不持久【英文标题】:In-memory H2 database, insert scripts not persisting 【发布时间】:2012-09-07 22:02:12 【问题描述】:

我打算将 H2 用作我的单元测试的内存数据库。我通过 Spring 将所有东西连接在一起。一切似乎工作正常。数据库加载完毕,ddl sql 文件运行,dml sql 也运行(或者看起来如此)。

我可以运行一个在数据库中创建记录的测试,然后检索并验证它是否被适当地持久化。所以这告诉我 ddl 脚本运行良好。

问题是当我尝试接收通过 dml 脚本插入的记录时,我什么也得不到。

我尝试将相同的插入语句放入文件中两次,确实收到了一个唯一约束错误,这告诉我它们正在运行...但由于某种原因没有持久化

DDL:

DROP TABLE IF EXISTS `schema`.`region` ;CREATE  TABLE IF NOT EXISTS `schema`.`region` (
  `region_id` INT(11) NOT NULL ,
  `name` VARCHAR(56) NOT NULL ,
  `description` VARCHAR(512) NULL DEFAULT NULL ,
  PRIMARY KEY (`region_id`) );

DML:

INSERT INTO `schema`.`region` (`region_id`, `name`, `description`) VALUES (1001, 'TEST', 'TESTING');

网址:

jdbc:h2:file:db_test;MODE=mysql;INIT=create schema if not exists test_db\\;runscript from 'classpath:test_ddl.sql'\\;runscript from 'classpath:test_dml.sql'

任何帮助都会有所帮助。

谢谢

【问题讨论】:

我也有同样的问题,你解决了吗? 【参考方案1】:

请参阅常见问题解答中的Where are the Database Files Stored?。使用您使用的数据库 URL jdbc:h2:file:db_test,文件存储在当前工作目录中。根据您启动应用程序的位置,这是一个不同的位置,因此使用不同的数据库。

我建议改用jdbc:h2:~/db/test_db...

我打算使用 H2 作为内存数据库

您实际上是在使用持久性数据库,请参阅database URL overview。

【讨论】:

是的,你是正确的关于我的 url 指示文件不是内存数据库。我的意图是最终使用内存 (jdbc:h2:mem:...) 我正在使用其他选项来查看它是否可以工作并且不准确地发布在此处。我很抱歉。话虽如此,我确实使用了 ~/db/... 格式,这提供了更多信息,这正是我所需要的。我的大部分跟踪文件包含“org.h2.jdbc.JdbcSQLException: Column "FOREIGN" not found; SQL statement:" 错误我有一个基本语句如下: 我的大部分跟踪文件包含“org.h2.jdbc.JdbcSQLException:未找到列“FOREIGN”;SQL 语句:”错误前语句:如果不存在则创建表s1.@987654326 @ ( id INT(11) NOT NULL , name VARCHAR(56) NOT NULL , description VARCHAR(512) NULL DEFAULT NULL, PRIMARY KEY (id) );如果不存在则创建表 s1.tableB ( tableB_id INT(11) NOT NULL , name VARCHAR(12) NOT NULL , tableA_id INT(11) NOT NULL , 主键 (tableB_id) , 约束 fk_tableA 外键 (tableA_id ) 参考 s1.tableA (id ) ON DELETE NO ACTION ON UPDATE NO ACTION); 这听起来像是一个不同的问题。您能否发布完整的错误消息(包括错误代码)和所有堆栈跟踪? org.h2.jdbc.JdbcSQLException:未找到列“FOREIGN”; SQL 语句:alter table s1.customer_network drop foreign key FKF3FBC2CDB2644654 [42122-168] at org.h2.message.DbException.getJdbcSQLException(DbException.java:329) at org.h2.message.DbException.get(DbException.java:169) ) at org.h2.message.DbException.get(DbException.java:146) at org.h2.table.Table.getColumn(Table.java:605) at org.h2.command.Parser.parseAlterTable(Parser.java: 4874) 在 org.h2.command.Parser.parseAlter(Parser.java:4315) 在 org.h2.command.Parser.parsePrepared(Parser.java:306) 在 org.h2.command.Parser.parse(Parser.java:251) 在 org.h2.command.Parser 的 org.h2.command.Parser.parse(Parser.java:279) .prepareCommand(Parser.java:217) 在 org.h2.engine.Session.prepareLocal(Session.java:415) 在 org.h2.engine.Session.prepareCommand(Session.java:364) 在 org.h2.jdbc。 JdbcConnection.prepareCommand(JdbcConnection.java:1109)

以上是关于内存 H2 数据库,插入脚本不持久的主要内容,如果未能解决你的问题,请参考以下文章

无法在 h2 内存数据库中插入数据

从 SQL 脚本在 H2 数据库中插入长文本

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

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

H2单元测试与业务数据隔离之内嵌模式

如何在内存数据库脚本中为 h2 指定字符编码?