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.
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)
}
Essayez plutôt celui-ci:
def create(name: String, price: Double): Future[Int] = db.run {
(items returning items.map(_.id)) += Item(0, name, price)
}