slick - 如何在 Slick 中将“FixedSqlAction”转换为“StreamingDBIO”?
问题描述
我正在使用 Alpakka 和 Slick 模块创建一个 akka-stream,但我遇到了类型不匹配的问题。
一个分支是关于在他们的表中获取发票总数:
def getTotal(implicit session: SlickSession) = {
import session.profile.api._
val query = TableQuery[Tables.Invoice].length.result
Slick.source(query)
}
但是最后一行没有编译,因为 Alpakka 期待 aStreamingDBIO
但我提供了FixedSqlAction[Int,slick.dbio.NoStream,slick.dbio.Effect.Read]
.
如何从非流媒体结果转移到流媒体结果?
解决方案
获取表的长度会产生单个值,而不是流。所以最简单的获取Source
流的方法是
def getTotal(implicit session: SlickSession): Source[Int, NotUsed] =
Source.lazyFuture { () =>
// Don't actually run the query until the stream has materialized and
// demand has reached the source
val query = TableQuery[Tables.Invoice].length.result
session.db.run(query)
}
Alpakka 的 Slick 连接器更面向具有大量结果的查询的流式处理(包括管理分页等)结果。对于单个结果,将Future
vanilla Slick 为您提供的结果转换为流就足够了。
如果您想在调用后立即开始执行查询getTotal
(请注意,无论下游是否曾经运行或需要来自源的数据),您可以
def getTotal(implicit session: SlickSession): Source[Int, NotUsed] = {
val query = TableQuery[Tables.Invoice].length.result
Source.future(session.db.run(query))
}
推荐阅读
- android - 有没有办法知道我在某个构建中拥有的每个 gradle 依赖项的版本?
- git - 使用 git add -p 时如何配置 git 以显示移动的行?
- oracle-data-integrator - 如何在 ODI 中的 2 个表之间进行多个联接?
- java - 捕获 ARCore ArSceneView 的位图
- java - 使用嵌套方法的方法引用运算符很热门?
- maven - Maven UnknownArchetype 异常
- multithreading - 在 pthread_cond_timedwait 和 pthread_mutex_lock 上崩溃
- git - GitHub 拉取请求与 Git 命令行合并
- javascript - 将 agSetColumnFilter 与服务器端行模型一起使用
- r - 为什么此应用函数返回与循环不同的值?