我正在尝试插入 - 如果不存在已经使用这段代码
case class Item(name: String, id: Long = 0L) // name is unique
val data = Query("Bob")
val exists = items.filter(_.name === "Bob").exists
val sel = data.filterNot(_ => exists)
val action = items.map(_.name).forceInsertQuery(sel)
它有效,但我想返回行的id(现有/已插入)。目前它返回一个布尔值。如何在不必再次查询的情况下获取ID?
答案 0 :(得分:1)
如果id
是primary key
和auto increment
,那么您可以在同一个插入查询中返回id
。如果没有,那就不可能了。
val tableQuery = TableQuery[Items] //items is a slick table
def getIdAfterInsert(item: Item): DB[Long] = {
tableQuery.filter(_.name === item.name).take(1).result.headOption.flatMap {
case Some(dbItem) =>
DBIO.successful(dbItem.id)
case None =>
tableQuery.returning(tableQuery.map(_.id)) += item
}
}
但如果id
不是primary key
而auto increment
则必须这样做。
def getIdAfterInsert(item: Item): DBIO[Long] = {
tableQuery.filter(_.name === item.name).take(1).result.headOption {
case Some(item) => DBIO.successful(item.id)
case None =>
(tableQuery += item).flatMap { _ =>
tableQuery.filter(_.name === item.name).take(1).result.id //this is the extra query
}
}
}