【问题标题】:Scala/slick: Get the id of row inserted if not exists alreadyScala / slick:如果不存在则获取插入的行的ID
【发布时间】: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?

【问题讨论】:

    标签: scala slick


    【解决方案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 更改了实现只是检查
    猜你喜欢
    • 2017-02-10
    • 2015-08-22
    • 1970-01-01
    • 2013-12-09
    • 2014-04-28
    • 2023-03-21
    • 2011-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多