Scala Slick 更新列值
Scala Slick update column value
我在 Play 中使用 Slick,但在尝试更新列值时遇到了一些问题,因为它没有被更新,尽管我没有收到任何错误回复。
我有一列告诉我是否选择了给定的行。我想要做的是获取当前选定的值(存储在数据库列中),然后更新同一列以具有相反的值。目前(经过多次不成功的尝试)我有以下编译和运行的代码,但在幕后没有任何反应:
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 的新手,所以这可能根本没有任何意义!)
这需要是单独的操作:一次读取,然后更新。 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
但据我所知,高级 slick api 不支持此构造。因此在您的情况下需要两个单独的数据库操作。如果有人证明我错了,我本人将不胜感激。
我在 Play 中使用 Slick,但在尝试更新列值时遇到了一些问题,因为它没有被更新,尽管我没有收到任何错误回复。
我有一列告诉我是否选择了给定的行。我想要做的是获取当前选定的值(存储在数据库列中),然后更新同一列以具有相反的值。目前(经过多次不成功的尝试)我有以下编译和运行的代码,但在幕后没有任何反应:
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 的新手,所以这可能根本没有任何意义!)
这需要是单独的操作:一次读取,然后更新。 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
但据我所知,高级 slick api 不支持此构造。因此在您的情况下需要两个单独的数据库操作。如果有人证明我错了,我本人将不胜感激。