scala - 如何在 Scala Slick 中运行补丁/部分数据库更新?

标签 scala slick

我们想运行一个补丁/部分 UPDATE使用 Slick (3.0.0) 以便我们只修改记录中的一些字段。究竟哪些字段将被准确更新只有在运行时才能知道。

例如,对于 REST PATCH request .

目前我们运行 SELECT首先获取原始记录,然后运行 ​​UPDATE但在单个 SQL 语句中执行此操作会更好。

像这样的东西:

def patchPerson(name: Option[String], age: Option[Int]) = {
   people.filter(_.name === "M Odersky")
       .map(p => 
           (name, age) match {
              case (Some(_), Some(_)) => (p.name, p.age)
              case (Some(_), None)    => (p.name)
              case (None   , Some(_)) => (p.age)
           }
       )
       .update(
           (name, age) match {
              case (Some(_), Some(_)) => (name.get, age.get)
              case (Some(_), None)    => (name.get)
              case (None   , Some(_)) => (age.get)
           }
       )
}

(请忽略这里的丑陋代码)

上面没有编译并出现以下错误消息:

No matching Shape found. Slick does not know how to map the given types. Possible causes: T in Table[T] does not match your * projection. Or you use an unsupported type in a Query (e.g. scala List). Required level: slick.lifted.FlatShapeLevel Source type: Object Unpacked type: T Packed type: G



和:

not enough arguments for method map: (implicit shape: slick.lifted.Shape[_ <: slick.lifted.FlatShapeLevel, Object, T, G])slick.lifted.Query[G,T,Seq]. Unspecified value parameter shape.



我认为这是因为 Slick 期望元组长度和类型与 filter 的结果相匹配。和 update职能。

我们已经尝试使用 Slick heterogeneous list类,但这似乎也期望长度和类型匹配。

有没有办法在 Slick 中编写它,以便我们可以通过一次数据库调用更新记录中的任意数量的字段?

最佳答案

为什么不在构造更新查询之前进行模式匹配?

def patchPerson(name: Option[String], age: Option[Int]) = {
   val query = people.filter(_.name === "M Odersky")
   (name, age) match {
     case (Some(name), Some(age)) =>
       query.map(p => (p.name, p.age)).update(name, age)
     case (Some(name), None) =>
       query.map(p => p.name).update(name)
     case (None, Some(age)) =>
       query.map(p => p.age).update(age)
   }
}

关于scala - 如何在 Scala Slick 中运行补丁/部分数据库更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30848004/

相关文章:

postgresql - 无法通过 Play 框架服务器连接到 postgresql docker 容器

sql - Slick - 参数在查询模板中被忽略

scala - autoInc 与 Postgres 和 Slick

scala - 在 Scala 特征上定义隐式 View 边界

scala - Scala 错误 SI-7914 - 从 Scala 宏返回应用方法是否有任何解决方法?

scala - 新的 Scala TypeTags 如何改进(已弃用) list ?

postgresql - 光滑的查询非常慢

scala - 来自 Spark Streaming 的 Rest API 服务调用

scala - 如何在 Scala 中使用优先队列?

postgresql - 关于如何使用 Case-When 执行自定义排序的 Play-Slick 说明