scala - Slick:刚获取时更新不可用
问题描述
我正在尝试这个巧妙的示例,当我尝试创建一个条目然后立即获取它时,我没有得到记录。我修改了测试用例,如下所示。
val response = create(BankProduct("car loan", 1)).flatMap(getById)
whenReady(response) { p =>
assert(p.get === BankProduct("car loan", 1))
}
以上失败,因为创建的BankProduct
不能立即获取。它为此使用 h2 db,以下是配置。
trait H2DBComponent extends DBComponent {
val logger = LoggerFactory.getLogger(this.getClass)
val driver = slick.driver.H2Driver
import driver.api._
val randomDB = "jdbc:h2:mem:test" + UUID.randomUUID().toString() + ";"
val h2Url = randomDB + "MODE=MySql;DATABASE_TO_UPPER=false;INIT=runscript from 'src/test/resources/schema.sql'\\;runscript from 'src/test/resources/schemadata.sql'"
val db: Database = {
logger.info("Creating test connection")
Database.forURL(url = h2Url, driver = "org.h2.Driver")
}
}
private[repo] trait BankProductTable extends BankTable { this: DBComponent =>
import driver.api._
private[BankProductTable] class BankProductTable(tag: Tag) extends Table[BankProduct](tag, "bankproduct") {
val id = column[Int]("id", O.PrimaryKey, O.AutoInc)
val name = column[String]("name")
val bankId = column[Int]("bank_id")
def bank = foreignKey("bank_product_fk", bankId, bankTableQuery)(_.id)
def * = (name, bankId, id.?) <> (BankProduct.tupled, BankProduct.unapply)
}
protected val bankProductTableQuery = TableQuery[BankProductTable]
protected def bankProductTableAutoInc = bankProductTableQuery returning bankProductTableQuery.map(_.id)
}
我不明白为什么会发生这种情况以及如何避免这种情况?我也尝试添加属性autoCommit
,但它也不起作用。
感谢任何帮助澄清这种歧义。
解决方案
create
这可能是由于调用关闭其连接后内存中的数据库内容丢失。根据文档:
默认情况下,关闭与数据库的最后一个连接会关闭数据库。对于内存数据库,这意味着内容丢失。要保持数据库打开,请将 ;DB_CLOSE_DELAY=-1 添加到数据库 URL。要在虚拟机处于活动状态时保留内存数据库的内容,请使用 jdbc:h2:mem:test;DB_CLOSE_DELAY=-1。
但是,添加后DB_CLOSE_DELAY=-1
,由于以下原因会出现错误
runscript from 'src/test/resources/schemadata.sql'
它在每个连接上执行,因此需要进行重构,以便在初始化时仅填充一次数据库。
推荐阅读
- mybatis - 使用 mybaits 调用存储过程,参数是 Map ,但我无法获取 OUT 参数
- delphi - 如何检测剪贴板文本更改?
- python - 无法在 Python OpenCV 中接收帧
- python - 来自 ModelForm 的图像未保存
- reactjs - Mount 不适用于带有下一个 js 的酶
- oracle - 如何在 PL/SQL 中按表集合使用索引
- spring-boot - 根据路由修改请求/响应(spring boot)
- php - 新闻网站如何不断更新故事?
- c# - 使用 .Net Core 3.1 的 POST 请求和 Power Automate 的 HTTP 请求
- python - 为什么在运行 python 可执行文件时出现此错误?