2015-07-16 6 views
28

ich diesen Code geschrieben haben, die perfektSlick 3.0 einsetzen und erhalten Auto Increment Wert dann

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

funktioniert dieser Code funktioniert, aber der Rückgabewert ist die Anzahl der Datensätze eingefügt. Aber ich möchte den Wert von AutoInc nach der Einfügung zurückgeben.

habe ich Google und fand einige Artikel

Slick 3.0.0 AutoIncrement Composite Key

Returning the auto incrementing value after an insert using slick

Aber irgendwie diese die Frage sauber nicht beantworten.

Antwort

49

Hier ist der relevant documentation page, wonach, sollten Sie eine Abfrage wie folgt konstruieren:

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. Ich fand, dass [Play-Slick-Silhouette] (https://github.com/sbrunk/play-silhouette-slick-seed) die TypeSafe Activator Vorlage eine ziemlich gute Einführung ist, wie man Slick 3.0 in einer "echten" Umgebung verwendet Zum Beispiel [hier] (https://github.com/sbrunk/play-silhouette-slick-seed/blob/master/app/models/daos/PasswordInfoDAO.scala) und [hier] (https: // github. com/sbrunk/play-silhouette-slick-samen/blob/master/app/modelle/daos/UserDAOImpl.scala), einschließlich der 'Return zugewiesene Identität' Problem. –

+0

Wenn ich Ihnen eine Aufwertung von 100+ geben könnte, würde ich. Dies ist wahrscheinlich die prägnanteste Antwort auf diese Frage, die ich gesehen habe. –

+2

das mag offensichtlich sein, aber ich bin neu in Slick/Scala, in welcher Variable die Autoinkrement-Spalte gespeichert ist? wie bekommt man es? – ps0604