Scala / slick:如果不存在则获取插入的行的ID
Posted
技术标签:
【中文标题】Scala / slick:如果不存在则获取插入的行的ID【英文标题】:Scala/slick: Get the id of row inserted if not exists already 【发布时间】:2017-03-07 17:21:18 【问题描述】:我正在尝试插入已使用此代码的不存在
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?
【问题讨论】:
【参考方案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
【讨论】:
id 是主键.. 是否可以返回现有行的 ID 而不是 -1 ? @srvy 现有 iditem.id
可能不是数据库 id
@srvy 更改了实现只是检查以上是关于Scala / slick:如果不存在则获取插入的行的ID的主要内容,如果未能解决你的问题,请参考以下文章
插入具有自动增量 id 的行 - Playframework Scala - Slick