web-dev-qa-db-ja.com

スリック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

スリックを使用して挿入後に自動インクリメント値を返す

しかし、どういうわけかこれらは質問にきれいに答えません。

30
Knows Not Much

関連ドキュメントページ を示します。これに応じて、次のようなクエリを作成する必要があります。

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)
}
57
dcastro

代わりにこれを試してください:

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