H2 数据库内容在插入和更新时不持久

H2 database content is not persisting on insert and update

我正在使用 h2 数据库来测试我的 postgres slick 功能。

我创建了一个下面的 h2DbComponent:


    trait H2DBComponent extends DbComponent {

      val driver = slick.jdbc.H2Profile
      import driver.api._
      val h2Url = "jdbc:h2:mem:test;MODE=PostgreSQL;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false;INIT=runscript from './test/resources/schema.sql'\;runscript from './test/resources/schemadata.sql'"

      val logger = LoggerFactory.getLogger(this.getClass)

      val db: Database = {
        logger.info("Creating test connection ..................................")
        Database.forURL(url = h2Url, driver = "org.h2.Driver")
      }
    }

在上面的代码片段中,我正在使用 schema.sql 创建我的 table 并使用 schemadata.sql.

插入一行(记录)

然后我尝试使用我的测试用例将记录插入 table 中:


    class RequestRepoTest extends FunSuite with RequestRepo with H2DBComponent {

      test("Add new Request") {
        val response = insertRequest(Request("XYZ","tk", "DM", "RUNNING", "0.1", "l1", "file1",
          Timestamp.valueOf("2016-06-22 19:10:25"), Some(Timestamp.valueOf("2016-06-22 19:10:25")), Some("scienceType")))
        val actualResult=Await.result(response,10 seconds)
        assert(actualResult===1)

        val response2 = getAllRequest()
        assert(Await.result(response2, 5 seconds).size === 2)
      }
    }

上面的插入断言工作正常,说明记录已插入。但是 getAllRequest() 断言失败,因为输出仍然包含单行(由 schemadata.sql 插入)=> 这意味着 insertRequest 更改不会保留。但是,以下语句指出记录已插入,因为插入返回 1,说明已插入一条记录。


    val response = insertRequest(Request("CMP_XYZ","tesco_uk", "DM", "RUNNING", "0.1", "l1", "file1",
        Timestamp.valueOf("2016-06-22 19:10:25"), Some(Timestamp.valueOf("2016-06-22 19:10:25")), 
        Some("scienceType")))
    val actualResult=Await.result(response,10 seconds)

下面是我对 insertRequest 的定义:


    def insertRequest(request: Request):Future[Int]= {
        db.run { requestTableQuery += request }
    }

我不知道如何才能看到插入的记录。有什么我需要补充的property/config吗?

But the getAllRequest() assert fails as the output still contains the single row(as inserted by schemadata.sql) => which means the insertRequest change is not persisted

我会仔细检查 assert(Await.result(response2, 5 seconds).size === 2) 行是否由于大小差异而失败。它会因为其他一些一般性故障而失败吗?

例如,由于每个连接上的 INIT 是 运行,这可能是您正在为每个连接重新创建数据库。除非您小心处理 SQL,否则可能会产生诸如 "table already exists" 之类的错误。将 TRACE_LEVEL_SYSTEM_OUT=2; 添加到您的 H2 URL 有助于跟踪 H2 在做什么。

一些建议。

首先,您可以根据需要确保您的 SQL 仅 运行。例如,您的 schema.sql 可以添加检查以避免尝试创建 table 两次:

CREATE TABLE IF NOT EXISTS my_table( my_column VARCHAR NULL );

你的schemadata.sql也是如此:

MERGE INTO my_table KEY(my_column) VALUES ('a') ;

或者,您可以围绕测试建立模式和测试数据(例如,可能在 Scala 代码中,使用 Slick)。您的测试框架可能有一种方法可以确保某些东西在测试或测试套装前后是 运行。