【问题标题】:Play + Slick: How to do partial model updates?Play + Slick:如何进行部分模型更新?
【发布时间】:2014-03-10 03:01:56
【问题描述】:

我正在使用带有 Slick 2.0(带有 MYSQL 后端)的 Play 2.2.x 来编写 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=?

【问题讨论】:

    标签: mysql scala playframework playframework-2.0 slick


    【解决方案1】:

    免责声明:我没有使用过 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 用户,更不用说专家了:-)

    【讨论】:

    猜你喜欢
    • 2015-12-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-25
    • 2015-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多