使用可选列更新 Scala Slick 行

Update Scala Slick rows with optional columns

我有一个包含多列的 Slick Table,我想根据用户输入更新其中一些列。我的 table 看起来像这样:

class Users(_tableTag: Tag) extends Table[User](_tableTag, "users") {
  def * = (id, name, email, phone, passwordHash, createdAt) <> (User.tupled, User.unapply)

  val id: Rep[Long] = column[Long]("id", O.AutoInc, O.PrimaryKey)
  val name: Rep[String] = column[String]("name")
  val email: Rep[String] = column[String]("email")
  val phone: Rep[String] = column[String]("phone")
  val passwordHash: Rep[String] = column[String]("password_hash")
  val createdAt: Rep[java.sql.Timestamp] = column[java.sql.Timestamp]
      ("created_at", SqlType("TIMESTAMP NOT NULL DEFAULT current_timestamp"))
}

User 案例 class 看起来像这样:

case class User(
  id: Long,
  name: String,
  email: String,
  phone: String,
  passwordHash: String,
  createdAt: Timestamp) 

我在 Play 中使用 slick,所以我想我应该根据用户提供的可选 json 字段构建一个更新案例 class,如下所示:

case class UserUpdate(
  id: Long,
  name: Option[String],
  email: Option[String],
  phone: Option[String],
  passwordHash: Option[String])

我如何进行灵活的 3.1 查询来更新此更新对象中 Some(value) 类型的字段?

正如@insan-e 所建议的,您可以通过 userUpdate.id 获取 existingUser 并使用 existingUser.field.getOrElse(existingUser.field).

进行更新

目前无法使用 slick api 在单个更新查询中执行此操作,这是已知的 issue