Scala / slick:如果不存在,则获取插入行的id

时间:2016-10-25 15:17:00

标签: scala slick

我正在尝试插入 - 如果不存在已经使用这段代码

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 个答案:

答案 0 :(得分: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
    }
 }
}