如何使用 Scala quill 执行可选列的更新?

How to perform an update with optional columns using Scala quill?

我正在开发使用 Scala Quill 的遗留系统。我想在我的 DAO 中有一个通用的更新函数,并且只更新传递的列。例如:

override def updateStatus(
    personId: Int,
    name: Option[String] = None,
    address: Option[String] = None): Long = ctx.run(
      query[Person]
      .filter(_.id == lift(personId))
      .update(
        p => if (name.isDefined) p.name -> lift(name.get) else p.name -> p.name,
        p => if (address.isDefined) p.address -> lift(address.get) else p.address = p.address
      )
    )

上面的示例虽然可以编译,但会引发以下运行时异常:

org.postgresql.util.PSQLException: ERROR: column "unused" of relation "person" does not exist
  Position: 99

有什么建议吗?

Quill 只是将您的代码翻译成 sql,因此代码的每一部分都应包含在 lift.

编译 Scala 代码时,您会看到翻译后的 sql 代码。

无法将 if (name.isDefined) p.name -> lift(name.get) else p.name -> p.name 翻译成 sql。

而且您的代码有一些拼写错误。比如p.address = p.address

顺便说一句,不建议在 Option 值中使用 .get。当我们忘记检查值时,None.get 将抛出 NoSuchElementException。

试试这个

def updateStatus(
    personId: Int,
    name: Option[String] = None,
    address: Option[String] = None
  ) = ctx.run {
    query[Person]
      .filter(_.id == lift(personId))
      .update(
        p => p.name -> lift(name.getOrElse(p.name)),
        p => p.address -> lift(address.getOrElse(p.address))
      )

  }

它将被翻译成sql,如下所示

UPDATE person SET name = ?, address = ? WHERE id = ?