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

时间:2018-04-29 11:56:46

标签: scala h2 slick

我确信我错过了一些非常愚蠢的东西 - 我有一个非常简单的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)来初始化表中的两个基本行。

单元测试的返回工作正常,它们获取init脚本插入的两行,我刚刚添加了一个简单的单元测试来创建一行,然后全部检索它们 - 假设它将获取三行,但无论我做什么,它只会检索最初的两个:

  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,正如我所料(我也尝试过插入而不执行返回步骤并让它返回行数inserted,返回1,作为expecteD),但查看q中返回的值,它只是init脚本插入的前两行。

我错过了什么?

1 个答案:

答案 0 :(得分:1)

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

有两种情况:

  1. 使用keepAliveConnection = true(或通过将DB_CLOSE_DELAY=-1附加到JDBC网址)执行连接,init.sql类似于:
  2. 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网址),init.sql类似于:
    2. CREATE TABLE QUESTION(...);
      INSERT INTO QUESTION VALUES(null, ...);
      INSERT INTO QUESTION VALUES(null, ...);
      

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

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

      在此调用之后的方案(2)中,连接已关闭,并且根据H2 documentation

        

      默认情况下,关闭与数据库的最后一个连接会关闭数据库。对于内存数据库,这意味着内容丢失。要使数据库保持打开状态,请将DB_CLOSE_DELAY = -1添加到数据库URL。要在虚拟机处于活动状态时保留内存数据库的内容,请使用jdbc:h2:mem:test; DB_CLOSE_DELAY = -1。

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

      在方案(1)中,第一个连接保持活动状态(以及数据库内容),但新连接将重新执行删除数据库内容的初始化脚本(init.sql)。

      鉴于(在两种情况下)questionDao.createQuestion按预期返回3,但随后内容丢失,因此对questionDao.questions的后续调用将使用刚刚初始化的数据库。< / p>