Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.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
Scala 滑动更新返回更新的对象_Scala_Slick - Fatal编程技术网

Scala 滑动更新返回更新的对象

Scala 滑动更新返回更新的对象,scala,slick,Scala,Slick,我现在正试图让一个函数在db对查询运行update方法后返回更新的对象,但我不知道如何成功返回该对象。这是我使用找到的示例编写的函数,但我想扩展q.updatecat以返回Future[Cat] def update(id: Long, cat: Cat): Future[Unit] = db.run { val q = for { c <- cats if c.id === id } yield c q.update(cat).map(_ => ()) } 您应该尝试以下

我现在正试图让一个函数在db对查询运行update方法后返回更新的对象,但我不知道如何成功返回该对象。这是我使用找到的示例编写的函数,但我想扩展q.updatecat以返回Future[Cat]

def update(id: Long, cat: Cat): Future[Unit] = db.run {
  val q = for { c <- cats if c.id === id } yield c
  q.update(cat).map(_ => ())
}

您应该尝试以下方法:

def update(id: Long, cat: Cat): Future[Option[Cat]] = db.run {
  cats.filter(_.id === id).update(cat).map {
    case 0 => None
    case _ => Some(cat)
  }
}

您应该返回Future[Option[Cat]]而不是Future[Cat],因为提供ID的Cat可能不存在。更新方法返回0值。违反完整性约束将导致未来的失败。

您可能希望将其视为一种快速解决方案,你只需使用修改后的值在cat实体上进行复制,并仅在操作成功时返回它。我认为复制输入不适用于通过触发器lastUpdated timestamp等更新的字段。这在Postgresql数据库中非常常见。我认为这在这种特定情况下可能有效,但-1。如果没有具有此ID的用户,更新是否真的失败?可能不是,事实上这就是UpdateCount 0案例所涵盖的内容。2.我不认为这一系列的DB操作会导致锁定,所以即使您正在事务中运行,您也不必。。。这几乎是一个更新,然后是一个包装在无意义事务中的select。如果我错了,请纠正我,但我对交易也有类似的误解。它们为故障提供回滚功能,但我认为这个Q更多地是关于原子更新/读取的。我以一种不使用事务的方式简化了我的解决方案,但是早期的解决方案仍然可以按预期工作。回答你的问题:1。你说得对——在我的帖子中,fail这个词有点误导人,因为如果用DBIO.failed替换DBIO.successful,这种情况不会返回失败。2.因为它是一个更新,然后是一个选择,所以该事务并不是毫无意义的,现在整个事情都是ACID。从文档中:如果包装操作成功,则提交事务;如果包装操作失败,则回滚事务。酷。我明白你的意思,我的观点很简单,更新/选择序列中没有任何东西会导致事务回滚。即使您在0个受影响行的情况下抛出了一个失败,您真正在做什么,不回滚任何更新?我相信不能保证在您可以更新和选择的事务中不存在竞争条件,您选择的内容可能已经被另一个线程更改了,只是简单地说,每一行都将单独执行,并在出现任何故障时回滚。在某些情况下,获得确切的状态很重要,而在其他情况下,可能不会