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

Kno*_*uch 31 scala slick 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)
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

光滑的3.0.0 AutoIncrement复合键

使用光滑插入后返回自动递增值

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

dca*_*tro 57

这是相关的文档页面,根据它,你应该构建一个这样的查询:

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)
}
Run Code Online (Sandbox Code Playgroud)

  • +1.我发现[Play-Slick-Silhouette](https://github.com/sbrunk/play-silhouette-slick-seed)Typesafe Activator模板是一个很好的介绍如何在'真实'设置中使用Slick 3.0 ,例如[here](https://github.com/sbrunk/play-silhouette-slick-seed/blob/master/app/models/daos/PasswordInfoDAO.scala)和[here](https:// github. com/sbrunk/play-silhouette-slick-seed/blob/master/app/models/daos/UserDAOImpl.scala),包括"返回指定的身份"问题. (4认同)
  • 这可能是显而易见的,但我是新的光滑/ scala,自动增量列存储的变量是什么?怎么弄明白? (2认同)
  • @ ps0604上面的查询构造了一个`Item`实例,其中(自动递增)id设置为0.当一行插入数据库时​​,它会创建一个这个`Item`实例的*copy*,其中new copy的id设置为,例如,8而不是0 - `(item,id)=> item.copy(id = id)`.所以,为了回答你的问题,你会在`item.id`中找到自动增量值. (2认同)

小智 9

试试这个:

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