【问题标题】:How to return Future of Either[Throwable,Int] from a Scala Slick Query output如何从 Scala Slick Query 输出返回 Either[Throwable,Int] 的未来
【发布时间】:2021-07-12 13:54:19
【问题描述】:

我是 scala 的初学者,我正在使用 slickpostgres 作为我的 model API 之一 下面是我的函数,它以Id: String 作为输入并形成一个left inner join query,它返回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 。我想返回 FutureEither lengthIds 或一些 throwable exception 。我怎样才能在这里达到同样的效果。

【问题讨论】:

    标签: scala slick-3.0


    【解决方案1】:

    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]],那么你可以拨打toEitherTry

    【讨论】:

    • db.run(innerJoin.length.result.asTry) 这很有意义。我宁愿试图在外面数数。
    猜你喜欢
    • 2019-04-03
    • 1970-01-01
    • 1970-01-01
    • 2019-12-28
    • 1970-01-01
    • 2019-02-09
    • 2017-02-18
    • 2012-10-17
    • 1970-01-01
    相关资源
    最近更新 更多