我们想运行一个补丁/部分 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/