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】:

如果idprimary keyauto 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 keyauto 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 现有 id item.id 可能不是数据库 id @srvy 更改了实现只是检查

以上是关于Scala / slick:如果不存在则获取插入的行的ID的主要内容,如果未能解决你的问题,请参考以下文章

在 Scala 中使用 Slick 库获取自动增量值

插入具有自动增量 id 的行 - Playframework Scala - Slick

如何使用 Play with Scala 和 Slick 从数据库中获取记录

HSQLDB 如果不存在则插入,如果存在则更新

Slick:检索插入值的 id

在 slick、scala 中处理 Postgres json 数据类型