我们想运行补丁/部分UPDATE
使用 Slick (3.0.0),以便我们只修改记录中的某些字段。确切地说哪些字段将被更新只有在运行时才知道。
例如,对于一个REST PATCH request http://restcookbook.com/HTTP%20Methods/patch/.
目前我们运行一个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)
}
)
}
(请忽略这里丑陋的代码)
上面的代码无法编译,并出现以下错误消息:
未找到匹配的形状。 Slick 不知道如何映射给定的
类型。可能的原因:Table[T]中的T与您的*不匹配
投影。或者您在查询中使用了不受支持的类型(例如 scala
列表)。所需级别:slick.lifted.FlatShapeLevel 源类型:
对象 未打包类型:T 打包类型:G
And:
方法映射没有足够的参数:(隐式形状:
slick.lifted.Shape[_ <: slick.lifted.flatshapelevel t g>
我认为这是因为 Slick 期望元组长度和类型与两个结果相匹配filter
and update
功能。
我们尝试过使用 Slick异构列表 http://slick.typesafe.com/doc/3.0.0/api/index.html#slick.collection.heterogeneous.HList类,但这似乎也期望长度和类型匹配。
有没有一种方法可以在 Slick 中编写此代码,以便我们可以通过一次数据库调用来更新记录中的任意数量的字段?