如何从 Scala Slick 查询输出 return Either[Throwable,Int] 的未来
How to return Future of Either[Throwable,Int] from a Scala Slick Query output
我是 scala 的初学者,我正在使用 slick
和 postgres
作为我的 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 一个 Future
和 Either
length
的 Ids
或一些 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
。
我是 scala 的初学者,我正在使用 slick
和 postgres
作为我的 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 一个 Future
和 Either
length
的 Ids
或一些 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
。