免責聲明:我沒有用油滑的,所以我只是通過他們的文檔要爭取有關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用戶,更不用說專家了:-)
這對於SQL注入有多安全? – pathikrit
不完全,建議在浮動中使用提升的嵌入(根據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
我實際上會說「_不安全 - 」 - 我故意嘗試爲了避免在上面的示例中出現任何Slick API調用。現在再次查看Slick文檔,應該可以使用'StaticQuery'中的'update'方法(或者僅僅是'Q.u')來至少獲得參數化查詢而不是啞連接字符串查詢。 – millhouse