2014-02-12 56 views
4

我使用Play 2.2.x與Slick 2.0(使用MYSQL後端)編寫REST API。我有一個User模型,有很多字段,比如age,name,gender等等。我想創建一個路徑PATCH /users/:id,它接收主體中的部分用戶對象(即完整用戶模型的字段子集)並更新用戶信息。我很困惑我怎麼能做到這一點:玩+油滑:如何做部分模型更新?

  1. 如何在Play 2.2.x中使用PATCH動詞?
  2. 將部分用戶對象解析爲更新查詢以在Slick 2.0中執行的通用方法是什麼?我希望執行單個SQL語句,例如update users set age=?, dob=? where id=?

回答

0

免責聲明:我沒有用油滑的,所以我只是通過他們的文檔要爭取有關Plain SQL Queries

要回答你的第一個問題:

PATCH是剛剛另一個HTTP動詞在routes文件,所以你的例子:

PATCH  /users/:id   controllers.UserController.patchById(id) 

UserController則可能是這樣的:

val possibleUserFields = Seq("firstName", "middleName", "lastName", "age") 

def patchById(id:String) = Action(parse.json) { request => 

    def addClause(fieldName:String) = { 
    (request.body \ fieldName).asOpt[String].map { fieldValue => 
     s"$fieldName=$fieldValue" 
    } 
    } 

    val clauses = possibleUserFields.flatMap (addClause) 

    val updateStatement = "update users set " + clauses.mkString(",") + s" where id = $id" 

    // TODO: Actually make the Slick call, possibly using the 'sqlu' interpolator (see docs) 
    Ok(s"$updateStatement") 
} 

這是幹什麼的:

  • 定義的可能是存在於PATCH JSON

  • JSON字段名稱列表中定義的動作,將分析傳入的身體JSON

  • 迭代在所有可能的字段名,測試他們是否在傳入的JSON

  • 如果是這樣的存在,增加了表格fieldname=<newValue>的子句列表

  • 構建一個SQL更新語句,用英文逗號分隔這些條款的要求

我不知道這是給你足夠的通用性,則可能是一種方式來獲得的字段名(即Slick列名),但就像我說的,我甚至不是一個Slick用戶,更不用說專家了:-)

+0

這對於SQL注入有多安全? – pathikrit

+0

不完全,建議在浮動中使用提升的嵌入(根據https://groups.google.com/forum/#!msg/scalaquery/7HHTH2t-ULw/8KGZnS2kywAJ對SQL注入是安全的)。 有關更新,請參閱http://slick.typesafe.com/doc/2.0.0/queries.html#updating。文檔的這一部分假定您有一個模式,請參閱http://slick.typesafe.com/doc/2.0.0/gettingstarted.html#schema – Wellingr

+0

我實際上會說「_不安全 - 」 - 我故意嘗試爲了避免在上面的示例中出現任何Slick API調用。現在再次查看Slick文檔,應該可以使用'StaticQuery'中的'update'方法(或者僅僅是'Q.u')來至少獲得參數化查詢而不是啞連接字符串查詢。 – millhouse