web-dev-qa-db-fra.com

Slick 3.0 Insert et ensuite obtenir la valeur d'incrémentation automatique

J'ai écrit ce code qui fonctionne parfaitement

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

Ce code fonctionne mais la valeur de retour est le nombre d'enregistrements insérés. Mais je veux retourner la valeur de l'AutoInc après l'insertion.

j'ai fait google et trouvé quelques articles

Clé composite Slick 3.0.0 AutoIncrement

Retour de la valeur d'incrémentation automatique après une insertion à l'aide de slick

Mais d'une manière ou d'une autre, ceux-ci ne répondent pas clairement à la question.

30
Knows Not Much

Voici la page de documentation pertinente , selon laquelle, vous devez construire une requête comme celle-ci:

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

Essayez plutôt celui-ci:

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