gpt4 book ai didi

scala - 光滑插入 H2,但没有插入数据

转载 作者:行者123 更新时间:2023-12-04 02:38:36 25 4
gpt4 key购买 nike

我确定我在这里遗漏了一些非常愚蠢的东西 - 我有一个非常简单的 Slick 3.2 设置的单元测试。 DAO 具有如下基本的检索和插入方法:

  override def questions: Future[Seq[Tables.QuestionRow]] =
db.run(Question.result)

override def createQuestion(title: String, body: String, authorUuid: UUID): Future[Long] =
db.run(Question returning Question.map(_.id) += QuestionRow(0l, UUID.randomUUID().toString, title, body, authorUuid.toString))

我有一些单元测试 - 对于我在内存 H2 中使用的测试,并有一个设置脚本(传递给 jdbcurl)来初始化表中的两个基本行。

用于检索的单元测试工作正常,它们获取由初始化脚本插入的两行,我刚刚添加了一个简单的单元测试来创建一行然后检索它们——假设它将获取三行,但无论我做什么,它只会检索前两个:

  it should "create a new question" in {
whenReady(questionDao.createQuestion("Question three", "some body", UUID.randomUUID)) { s =>
whenReady(questionDao.questions(s)) { q =>
println(s)
println(q.map(_.title))
assert(true)
}
}
}

输出显示原始 s(从 autoinc 返回的 ID)是 3,如我所料(我也试过插入不执行返回步骤,只是让它返回插入的行数,返回 1,正如预期的那样),但是查看 q 中返回的值,它只是初始化脚本插入的前两行。

我错过了什么?

最佳答案

我的假设是您的 JDBC url 类似于 jdbc:h2:mem:test;INIT=RUNSCRIPT FROM 'init.sql'并且没有使用连接池。

有两种情况:

  1. 使用keepAliveConnection = true 执行连接(或通过将 DB_CLOSE_DELAY=-1 附加到 JDBC url)和 init.sql是这样的:
DROP TABLE IF EXISTS QUESTION;
CREATE TABLE QUESTION(...);
INSERT INTO QUESTION VALUES(null, ...);
INSERT INTO QUESTION VALUES(null, ...);
  1. 使用keepAliveConnection = false 执行连接(默认)(不将 DB_CLOSE_DELAY=-1 附加到 JDBC url)和 init.sql是这样的:
CREATE TABLE QUESTION(...);
INSERT INTO QUESTION VALUES(null, ...);
INSERT INTO QUESTION VALUES(null, ...);

调用questionDao.createQuestion将打开一个到 H2 数据库的新连接并触发初始化脚本(init.sql)。

在这两种情况下,在此调用之后,数据库立即包含一个 QUESTION有 2 行的表格。

根据 H2 documentation,在场景 (2) 中,在此调用后连接关闭:

By default, closing the last connection to a database closes the database. For an in-memory database, this means the content is lost. To keep the database open, add ;DB_CLOSE_DELAY=-1 to the database URL. To keep the content of an in-memory database as long as the virtual machine is alive, use jdbc:h2:mem:test;DB_CLOSE_DELAY=-1.

调用questionDao.questions然后将打开一个新的连接到您的 H2 数据库,并将触发再次初始化脚本(init.sql)。

在场景 (1) 中,第一个连接(以及数据库内容)保持事件状态,但新连接将重新执行初始化脚本 ( init.sql) 以清除数据库内容。

鉴于(在两种情况下)questionDao.createQuestion返回 3 ,如预期的那样,但随后内容丢失,因此随后调用 questionDao.questions将使用新初始化的数据库。

关于scala - 光滑插入 H2,但没有插入数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50086316/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com