【问题标题】:Slick lifted update on an Object对象的光滑提升更新
【发布时间】:2013-09-03 15:47:29
【问题描述】:

我使用 Slick 对提升的实体进行更新。此代码更新 Contact 对象的 firstName:

def updateContact(id: Int, firstName: Option[String]): Unit = {
  val q1 = for {
    c <- Contacts
    if c.id is id
  } yield c.firstName
  // Update value with same or new value
  q1.update(firstName.getOrElse(q1.list().head))
}

这里的选项对于更新值已经很有用,以防它是 Some (尽管如果只有在有新值时才进行更新会更好)。

我正在寻找一种通过 ID 查询对象的方法,然后使用 getOrElse 在内存中进行所有更新,然后对整个对象进行更新。

否则我必须为对象的每个字段运行上述操作,但你知道,感觉就像一个肮脏的黑客。

【问题讨论】:

  • this 是您要找的吗?

标签: database scala sql-update slick


【解决方案1】:

而不是q1.update(firstName.getOrElse(q1.list().head)) 你可以写firstName.foreach{ fn =&gt; q1.update(fn) } 这更短,更简单,一个而不是两个查询:)。 在 Option 上使用 foreach,当您将其视为具有一个或零个元素的集合时,它看起来就不再奇怪了。

关于获取整个对象、修改并保存回来的想法,您可以这样做:

def updateContact(id: Int, firstName: Option[String], lastName:Option[String], ...): Unit = {
  val q1 = Query(Contacts).filter(_.id === id)
  val c = q1.first
  val modifiedC = c.copy(
    firstName = firstName.getOrElse(c.firstName),
    lastName = lastName.getOrElse(c.lastName),
    ...
  )
  q1.update(modifiedC)
}

这是另一个例子:http://sysgears.com/notes/how-to-update-entire-database-record-using-slick/

这是干净和简单的,如果性能不是关键任务,这可能是最好的方法,因为这总是传输Contacts 的所有列。您可以通过仅传输选定的列来节省一些流量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-04
    • 2017-10-07
    • 2015-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-10
    相关资源
    最近更新 更多