2015-07-16 15 views
28

Ho scritto questo codice che funziona perfettamenteSlick 3.0 Inserisci e quindi ottenere incremento automatico Valore

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

Questo codice funziona, ma il valore di ritorno è il numero di record inseriti. Ma voglio restituire il valore di AutoInc dopo che l'inserimento è stato fatto.

ho fatto google e ho trovato alcuni articoli

Slick 3.0.0 AutoIncrement Composite Key

Returning the auto incrementing value after an insert using slick

Ma in qualche modo questi non rispondono alla domanda in modo pulito.

risposta

49

Ecco il relevant documentation page, in base al quale, si dovrebbe costruire una query come questa:

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

+1. Ho trovato che [Play-Slick-Silhouette] (https://github.com/sbrunk/play-silhouette-slick-seed) template Typesafe Activator è una buona introduzione su come usare Slick 3.0 in un'impostazione "reale" , ad esempio [qui] (https://github.com/sbrunk/play-silhouette-slick-seed/blob/master/app/models/daos/PasswordInfoDAO.scala) e [qui] (https: // github. com/sbrunk/play-silhouette-slick-seed/blob/master/app/models/daos/UserDAOImpl.scala), incluso il problema dell'identità restituita. –

+0

Se potessi darti un aumento di 100+ lo farei. Questa è probabilmente la risposta più concisa a questa domanda che ho visto. –

+2

questo può essere ovvio, ma io sono nuovo in slick/scala, in quale variabile è memorizzata la colonna autoincrement? come ottenerlo? – ps0604

Problemi correlati