Slick 3.0插入然后获得自动增量值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Slick 3.0插入然后获得自动增量值相关的知识,希望对你有一定的参考价值。

我写的这段代码完美无缺

class Items(tag: Tag) extends Table[Item](tag, "ITEMS") {
  def id = column[Long]("ITEMS_ID", O.PrimaryKey, O.AutoInc)
  def name = column[String]("ITEMS_NAME")
  def price = column[Double]("ITEMS_PRICE")
  def * = (id, name, price) <> ((Item.apply _).tupled, Item.unapply _)
}

object Shop extends Shop{
  val items = TableQuery[Items]
  val db = Database.forConfig("h2mem1")

  def create(name: String, price: Double) : Int = {
    val action = items ++= Seq(Item(0, name, price))
    val future1 = db.run(action)
    val future2 = future1 map {result => 
      result map {x => x}
    }
    Await.result(future2, Duration.Inf).getOrElse(0)
  }
}

此代码有效,但返回值是插入的记录数。但是我想在插入完成后返回AutoInc的值。

我做谷歌,发现很少的文章

Slick 3.0.0 AutoIncrement Composite Key

Returning the auto incrementing value after an insert using slick

但不知何故,这些并没有干净地回答这个问题。

答案

这是relevant documentation page,据此,你应该构造一个这样的查询:

val insertQuery = items returning items.map(_.id) into ((item, id) => item.copy(id = id))

def create(name: String, price: Double) : Future[Item] = {
  val action = insertQuery += Item(0, name, price)   
  db.run(action)
}
另一答案

试试这个:

def create(name: String, price: Double): Future[Int] = db.run {
    (items returning items.map(_.id)) += Item(0, name, price)
}

以上是关于Slick 3.0插入然后获得自动增量值的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 SQL 插入增量值

使用 Slick 3.0 在同一事务中进行多次插入

即使由于错误导致插入失败,MySQL 自动增量值也会增加

Slick 3.0 批量插入或更新(更新插入)

在插入中立即使用自动增量值

如何在 SQLite 的插入查询中返回自动增量值?