postgresql - 如何在 slick 3 的 DBIOAction 组合中使用 Future?

标签 postgresql scala slick slick-3.0

Slick 3 通过使用 flatMap 方法提供了 DBIOAction 组合。此外,我们可以在两个 DBIOAction 之间在后端进行一些计算。这在大多数情况下都很好,但是当计算结果在像 Future 这样的 monad 中时我应该怎么做?有阻塞方式的代码:

val fooQuery = TableQuery[FooTable]
val barQuery = TableQuery[BarTable]

def requestService(content: Iterable[String]): Future[Iterable[Long]] = ???

def modify(ids: Iterable[Long], change: String) = {

    val query = fooQuery.filter(_.id inSet ids).result.flatMap{ fooSeq =>
        val content = fooSeq.map(_.contentField)
        val requestServiceFuture = requestService(content)

        val serviceResult = Await.result(requestServiceFuture, 1.minute)
        barQuery.filter(_.id inSet serviceResult).delete //or other action
    }
    db.run(query.transactionally)
} 

有没有办法在不等待的情况下异步执行此代码?

最佳答案

您可以使用 DBIOAction.fromFuture 创建 DBIO,然后使用 flatMap

val query = for {
    fooSeq <- fooQuery.filter(_.id inSet ids).result
    content = fooSeq.map(_.contentField)
    serviceResult <- DBIOAction.from(requestService(content))
    result <- barQuery.filter(_.id inSet serviceResult).delete
} yield result

db.run(query.transactionally)

http://slick.lightbend.com/doc/3.1.1/api/index.html#slick.dbio.DBIOAction $

关于postgresql - 如何在 slick 3 的 DBIOAction 组合中使用 Future?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40581767/

相关文章:

PostgreSQL - 查询表列的大小

ruby-on-rails - 尝试让 pgsql 使用 rails 时出现错误 : Peer authentication failed for user "postgres",

postgresql - 从一组表左连接到postgresql中的另一组表

scala - Circe:强制可选字段为 `null`

java - 运行导出的 Slick2d 项目时出错

ruby-on-rails - 如何为生产配置 database.yml

scala - 当 match 收到 IndexedSeq 而不是 LinearSeq 时的 MatchError

scala - Scala错误建模

database - Play + Slick + HikariCP 应用程序中的加密数据库密码

android - 圆滑的 android ProguardCache 错误