0

我从数据库中批量删除项目,但我想将其作为事务进行。在这种情况下,我想要全有或全无的操作,它要么删除所有项目并返回成功的响应,要么在一个或多个项目不正确(数据库中不存在的项目等)时返回错误。首先,我想简单检查数据库中对象的存在,如果它们都存在,我想执行删除操作或抛出异常。

不幸的是,根据 Stack Overflow 上的文档和回复,我无法让事情正常工作。

我的操作如下所示:

def delete(siteIds: Long*): Future[Int] = {
    val filtered = sites.filter(_.id inSet siteIds)

    val action = (for {
      l <- filtered.length.result
      d <- l match {
        case c if c == siteIds.size => filtered.delete
        case _ => DBIO.failed(new InvalidEntityException)
      }
    } yield d) transactionally

    DB.run(action)
}

我也试过:

def delete(siteIds: Long*): Future[Int] = {
    val filtered = sites.filter(_.id inSet siteIds)

    val action = filtered.length.result.flatMap(l =>
      if (l == siteIds.size) {
        filtered.delete
      } else {
        DBIO.failed(new InvalidEntityException)
      }
    ) transactionally

    DB.run(action)
}

出于某种原因,@DBIO.failure@ 破坏了正确的响应。当我运行该代码时,如果数据不正确,则会引发异常,但如果数据正确,我会收到一个错误,提示某些内容(结果?)为空。

[error]    null (Site.scala:174)
[error] models.SiteDao$$anonfun$22.apply(Site.scala:174)
[error] models.SiteDao$$anonfun$22.apply(Site.scala:171)
[error]    slick.backend.DatabaseComponent$DatabaseDef$$anonfun$runInContext$1.apply(DatabaseComponent.scala:146)
[error] slick.backend.DatabaseComponent$DatabaseDef$$anonfun$runInContext$1.apply(DatabaseComponent.scala:146)

如何使其正常工作?

4

0 回答 0