如何从 Scala Slick 查询输出 return Either[Throwable,Int] 的未来

How to return Future of Either[Throwable,Int] from a Scala Slick Query output

我是 scala 的初学者,我正在使用 slickpostgres 作为我的 model API 之一 下面是我的函数,它将 Id: String 作为输入并形成 left inner join query 其中 returns matching Ids(String) from DB table.

def getCountByID(
    Id: String
  ): Future[Either[Throwable, Int]] = {
    val innerJoin = for {
      (rel,a) <- executors joinLeft executors on ( (e1, e2) => {
    e1.column1 === e2.column1 && e1.column2 === e2.column2
    } ) if rel.id === Id
  } yield a.map(_.id)

  db.run(innerJoin.result) # Seq of options => FixedSqlStreamingAction[Seq[Option[String]],Option[String],dbio.Effect.Read]

  }

db.run 给了我一个 Seq of options 。我想 return 一个 FutureEither lengthIds 或一些 throwable exception 。我怎样才能在这里实现同样的目标。

类型 Either[Throwable, Int] 基本上是 Try[Int] 的较差版本,所以我强烈建议在这里使用 Try。您可以在 result 上调用 asTry,您将得到 Future[Try[Seq[_]]:

db.run(innerJoin.result.asTry)

如果你想要一个计数,那么你应该在数据库中而不是在外部进行计数:

db.run(innerJoin.length.result.asTry)

这应该给出 Future[Try[Int]].

如果你真的需要 Future[Either[Throwable, Int]] 那么你可以在 Try 上调用 toEither