Postgresql H2数据库内容在插入和更新时未持久化
我正在使用h2数据库测试我的postgres slick功能 我创建了以下组件:Postgresql H2数据库内容在插入和更新时未持久化,postgresql,scala,playframework,h2,slick,Postgresql,Scala,Playframework,H2,Slick,我正在使用h2数据库测试我的postgres slick功能 我创建了以下组件: 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;I
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创建表,并使用schemadata.sql插入一个行记录
然后,我尝试使用我的测试用例在表中插入一条记录,如下所示:
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)
}
}
上面的insert断言可以很好地表示记录已插入。但是getAllRequest断言失败,因为输出仍然包含schemadata.sql=>插入的单个行,这意味着insertRequest更改不会持久化。但是,下面的语句声明插入该记录时,insert返回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 }
}
我不知道如何才能看到插入的记录。是否有需要添加的属性/配置
但是getAllRequest断言失败,因为输出仍然包含schemadata.sql=>插入的单个行,这意味着insertRequest更改不会持久化
我将再次检查AssertWait.resultresponse2,5秒。大小===2行是否由于大小差异而失败。它会不会因为其他一些普遍的失败而失败
例如,由于INIT在每个连接上运行,因此可能是您正在为每个连接重新创建数据库。除非您小心使用SQL,否则可能会产生一个错误,例如表已经存在。添加跟踪级系统输出=2;链接到H2 URL有助于跟踪H2正在做什么
一些建议
首先,您可以确保SQL只在需要时运行。例如,schema.sql可以添加检查以避免尝试创建表两次:
CREATE TABLE IF NOT EXISTS my_table( my_column VARCHAR NULL );
同样,对于schemadata.sql:
或者,您可以在测试周围建立模式和测试数据,例如,可能在Scala代码中,使用Slick。您的测试框架可能有办法确保在测试或测试套件之前和之后运行某些东西 您可以看看基于JDBC的代码的单元测试,我是添加属性TRACE_LEVEL_SYSTEM_OUT=2的贡献者;帮助。在执行每个数据库请求时,它创建连接,然后断开连接。如果我想在同一个文件RequestRepoTest中的假设4个测试中使用同一个db连接,有什么建议吗?我不知道如何在不改变操作的情况下明确使用单个连接。如果你真的想尝试,请在创建db时查看创建自定义执行器。我建议建立一个场景,围绕一组测试进行测试。下面是一个例子:
MERGE INTO my_table KEY(my_column) VALUES ('a') ;