2014-08-29 42 views
5

在下面的代碼中,我可以插入我的記錄。但我真的很想取回插入值的ID,這樣我就可以返回對象作爲我的響應的一部分。Play Slick 2.1.0這個DBMS只允許從INSERT中返回一個AutoInc列

def postEntry = DBAction { request => 
    request.body.asJson.map {json => 
    json.validate[(String, Long, String)].map { 
     case (name, age, lang) => { 
     implicit val session = request.dbSession 
     val something = Entries += Entry(None, name, age, lang) 
     Ok("Hello!!!: " + something) 
     } 
    }.recoverTotal { 
    e => BadRequest("Detected error: " + JsError.toFlatJson(e)) 
    } 
    }.getOrElse { 
    BadRequest("Expecting Json data") 
    } 
} 

所以我試圖改變插入到:

val something = (Entries returning Entries.map(_.id)) += Entry(None, name, age, lang) 

,但我得到以下異常:

SlickException: This DBMS allows only a single AutoInc column to be returned from an INSERT 

有一個關於它記在這裏:http://slick.typesafe.com/doc/2.1.0/queries.html

「請注意,許多數據庫系統只允許返回一列,它必須是表格的au增加主鍵。如果你問其他列的SlickException在運行時拋出(除非該數據庫實際上支持的話)。」

但它並沒有說怎麼剛申請的ID列。

+0

不'Entries'有主鍵?我不瘦k你的'id'列是唯一的,你將'None'傳遞給'Entry',這讓我認爲它是可選的。 – 2014-08-29 21:35:24

+0

謝謝!你讓我想起了我的映射,我回去檢查了一下。我設法回滾我的主鍵def和自動遞增def在Table映射上。 – 2014-08-29 22:01:04

+0

不客氣。 – 2014-08-29 22:09:46

回答

7

恩德鵺上面給我的提示發現問題。我需要有列標誌着該表定義主鍵和自動遞增。

class Entries(tag: Tag) extends Table[Entry](tag, "entries") { 

    def id = column[Option[Long]]("id", O.PrimaryKey, O.AutoInc) 
    def name = column[String]("name") 
    def age = column[Long]("age") 
    def lang = column[String]("lang") 

    def * = (id, name, age, lang).shaped <> ((Entry.apply _)tupled, Entry.unapply _) 
} 

O.PrimaryKey,O.AutoInc

+0

這仍然不能解決我的問題。這個解決方案是否解決了你的錯誤? – Maverick 2016-07-13 14:12:20

+0

這是對問題的更好概述 https://github.com/slick/slick/issues/1561 – 2017-04-26 13:55:00