Play + Slick:如何进行部分模型更新?

时间:2014-02-12 01:36:05

标签: mysql scala playframework playframework-2.0 slick

我使用Play 2.2.x和Slick 2.0(使用MYSQL后端)编写REST API。我有一个User模型,其中包含agenamegender等字段。我想创建一个路径PATCH /users/:id,它接收部分用户对象(即完整用户模型的字段的子集)在正文中并更新用户的信息。我很困惑如何实现这个目标:

  1. 如何在Play 2.2.x中使用PATCH动词?
  2. 将部分用户对象解析为在Slick 2.0中执行的更新查询的通用方法是什么?我希望执行单个SQL语句,例如update users set age=?, dob=? where id=?

1 个答案:

答案 0 :(得分:0)

免责声明:我没有使用Slick,所以我只是按照他们关于Plain SQL Queries的文档进行操作。

回答你的第一个问题:

PATCH只是您routes文件中的另一个HTTP动词,因此对于您的示例:

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

  • 的Action
  • 迭代所有可能的字段名称,测试它们是否存在于传入的JSON中

  • 如果是这样,请将表单fieldname=<newValue>添加到列表中

  • 构建SQL更新语句,根据需要用逗号分隔每个子句

我不知道这对你来说是否足够通用,可能有办法从Slick中获取字段名称(即Slick列名称),但就像我说的那样,我甚至不是Slick用户,更不用说专家了: - )