Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database Scala平滑更新列值_Database_Scala_Playframework_Slick - Fatal编程技术网

Database Scala平滑更新列值

Database Scala平滑更新列值,database,scala,playframework,slick,Database,Scala,Playframework,Slick,我在Play中使用Slick,但在尝试更新列值时遇到了一些问题,因为它没有被更新,尽管我没有得到任何错误 我有一个列,告诉我给定的行是否被选中。我想做的是获取当前选定的值(存储在DB列中),然后更新同一列,使其具有相反的值。目前(在多次尝试失败后),我有以下代码可编译并运行,但幕后什么也没有发生: val action = listItems.filter(_.uid === uid).map(_.isSelected).result.map { selected => val

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

我有一个列,告诉我给定的行是否被选中。我想做的是获取当前选定的值(存储在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)
val action=listItems.filter(u.uid==uid).map(u.isSelected).result.map{selected=>
val isSelected=selected.head
println(s“在->isSelected之前选择”)

val q=对于{li这需要单独的操作:一次读取后更新。Slick允许以整洁的方式组合操作:

val-targetRows=listItems.filter(\u0.uid==uid).map(\u0.isSelected)
val操作=用于{
booleanOption targetRows.update(!b))

受影响的我写了一个看起来更好的语法的答案。但是简而言之,你的代码的问题是<代码>结果。map < /Cord>必须是<代码>结果。NSWER我已经尝试了您在上面的评论中提到的更改,它是有效的!我只是不明白为什么
flatMap
map
相比会有所不同。我也更喜欢您的答案,但我似乎无法让它成为workmap和flatMap是两个非常不同的东西,不仅仅是在您的示例中。它们的定义trac回到范畴理论。你应该读一下,但基本上是用例子来说,如果你把
Int=>List[String]
的函数映射到
List[Int]
你会得到一个
List[List[String]
但是如果你把同一个函数映射到同一个列表,你会得到一个
List[String]]
如果将另一个
DBIOAction[T]
平面映射到第一个
DBIOAction[G]
则结果是一个
DBIOAction[T]
这是您想要的,并且是两个操作的组成部分。代码编译和运行时不会出现hickups,但是当我去检查值是否仍然没有更新时……是否可能与我使用的DBMS有关(H2用于开发环境)?我目前无法重现错误,但如果插入后在同一脚本中检查db的结果,应该不会有问题。我在这里编写了基本相同的脚本。您可以删除
。take(1)
位并再次运行它?还要确保在插入后使用所指出的flatMap构造或使用
Wait进行检查。结果
同样在您的示例和我的答案中,执行查询的返回结果是一个整数,指示受影响的行数。我的结果是零,您的结果是1?它与
.take(1)
part。我已经删除了它,现在它可以工作了。在进行您所说的检查时,使用
take
部分,它不会打印任何内容,但在删除时它会打印1。我的印象是,take部分删除了第一行,然后只在该行上执行某些操作,对吗?通过删除它,以防第一张地图返回的内容超过一行,它不会更新所有行吗?不管怎样,你能更新你的答案,这样我就可以把它标记为正确吗?谢谢!
。take(1)
等于mysql
Limit 1
,与我的假设相矛盾,它跳过了第一行将受影响的行,而不是将影响限制在一行。所以我的错在那里。我更新了它。