如何使用 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 = ?
我正在开发使用 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 = ?