繁体   English   中英

Scala Slick更新列值

[英]Scala Slick update column value

我正在使用Slick with Play但是在尝试更新列值时遇到了一些问题,因为它没有被更新,尽管我没有收到任何错误。

我有一个列告诉我是否选择了给定的行。 我想要做的是获取当前选定的值(存储在DB列中),然后更新该相同的列以具有相反的值。 目前(经过许多不成功的尝试)我有以下代码编译并运行但幕后没有任何反应:

val action = listItems.filter(_.uid === uid).map(_.isSelected).result.map { selected =>
      val isSelected = selected.head
      println(s"selected before -> $isSelected")
      val q = for {li <- listItems if li.uid === uid} yield li.isSelected
      q.update(!isSelected)
    }

db.run(action)

我做错了什么(我是新手,所以这根本没有任何意义!)

这需要单独行动:一次阅读,然后是更新。 Slick允许以一种简洁的方式组合动作:

val targetRows = listItems.filter(_.uid === uid).map(_.isSelected)
val actions = for {
  booleanOption <- targetRows.result.headOption
  updateActionOption = booleanOption.map(b => targetRows.update(!b))
  affected <- updateActionOption.getOrElse(DBIO.successful(0))
} yield affected

db.run(actions)

更新:

正如旁注,RDBMS通常有助于在一个数据库往返中执行更新的构造,例如将布尔列更新为相反的值,而无需先读取它并手动否定它。 这在mysql中看起来像这样:例如:

UPDATE `table` SET `my_bool` = NOT my_bool

但据我所知,高级光滑api不支持这种结构。 因此在您的情况下需要两个单独的数据库操作。 如果有人证明我错了,我自己会很感激。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM