在 slick 3.0 更新中仅更新非 None 案例 class 值
Updating only non-None case class values in slick 3.0 update
我有一组简单的案例 classes,每个都有一些可选的属性:
case class Person (name: Option[String], age: Option[Int], etc)
当提供所有 case class 属性时(不是 None),流畅的更新代码工作正常 - 我只是在更新查询中使用 case class 实例。
问题是,在很多情况下,属性的任意组合都可能是 None。我不想为每个组合写一个特定的更新查询方法。
如何在 slick 更新查询中使用 case class 以便 slick 仅更新 table 中的非 None 属性 值并保留其他值完好无损(不试图将它们设置为空)?
您可以使用 Slick 更新指定列:
http://slick.typesafe.com/doc/3.0.0/queries.html#updating
但是为了实现你想要的,我会用两个非常简单的数据库调用来实现:
val row = db.run(q.filter(_.id === id).result.head)
row.copy(name = row.name.map(newName), age = row.age.map(newAge), ...)
db.run(q.update(row))
注意使用 .map
仅在之前定义的情况下设置它。
我有一组简单的案例 classes,每个都有一些可选的属性:
case class Person (name: Option[String], age: Option[Int], etc)
当提供所有 case class 属性时(不是 None),流畅的更新代码工作正常 - 我只是在更新查询中使用 case class 实例。
问题是,在很多情况下,属性的任意组合都可能是 None。我不想为每个组合写一个特定的更新查询方法。
如何在 slick 更新查询中使用 case class 以便 slick 仅更新 table 中的非 None 属性 值并保留其他值完好无损(不试图将它们设置为空)?
您可以使用 Slick 更新指定列:
http://slick.typesafe.com/doc/3.0.0/queries.html#updating
但是为了实现你想要的,我会用两个非常简单的数据库调用来实现:
val row = db.run(q.filter(_.id === id).result.head)
row.copy(name = row.name.map(newName), age = row.age.map(newAge), ...)
db.run(q.update(row))
注意使用 .map
仅在之前定义的情况下设置它。