【发布时间】:2015-08-31 02:47:08
【问题描述】:
我们想使用 Slick (3.0.0) 运行补丁/部分 UPDATE,以便我们只修改记录中的一些字段。究竟哪些字段将被准确更新只有在运行时才能知道。
例如,对于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)
}
)
}
(请忽略这里丑陋的代码)
上面没有编译并出现以下错误消息:
找不到匹配的形状。 Slick 不知道如何映射给定的 类型。可能的原因: Table[T] 中的 T 与您的 * 不匹配 投影。或者您在查询中使用不受支持的类型(例如 scala 列表)。所需级别:slick.lifted.FlatShapeLevel 源类型: 对象解包类型:T 打包类型:G
还有:
方法映射的参数不足:(隐式形状: slick.lifted.Shape[_ <: slick.lifted.flatshapelevel t g>
我认为这是因为 Slick 期望元组长度和类型与 filter 和 update 函数的结果相匹配。
我们已经尝试使用 Slick heterogeneous list 类,但这似乎也期望长度和类型匹配。
有没有办法在 Slick 中编写此代码,以便我们可以通过一次数据库调用更新记录中的任意数量的字段?
【问题讨论】:
-
您找到解决方案了吗?
-
只运行原生 SQL 怎么样?
-
我已经添加了赏金,因为我遇到了与作者完全相同的问题。 @LukasEder 如果您不知道要修补哪些密钥,那将无法正常工作。例如。我有一个大的用户案例类要更新,我想要一个通用的 PATCH 端点,我可以简单地向它发送一个更新的字段。
-
我找到了一个类似问题的答案。 stackoverflow.com/a/42004236/7505973