首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Slick 3中执行事务中的非数据库操作

在Slick 3中执行事务中的非数据库操作
EN

Stack Overflow用户
提问于 2015-06-29 03:20:47
回答 1查看 3.9K关注 0票数 26

我在理解新的DBIOAction应用编程接口时遇到了困难,文档中似乎没有太多的示例。我使用Slick 3.0.0,我需要执行一些DB操作,还需要使用从数据库接收的数据进行一些计算,但所有这些操作都必须在单个事务中完成。我正在尝试做以下几件事:

  1. 执行对数据库( types表)的查询。
  2. 对查询结果进行一些聚合和过滤(根据步骤2( messages表-由于某些限制,此查询必须是原始

)的计算,不能对另一个查询执行此计算)。

  1. 将步骤2和3中的数据连接到内存中。

我希望步骤1和3中的查询在事务内执行,因为它们的结果集的数据必须是一致的。

我已经尝试过以一元连接的方式来做这件事。下面是我的代码的一个过于简化的版本,但我甚至不能编译它:

  val compositeAction = (for {
    rawTypes <- TableQuery[DBType].result
    (projectId, types) <- rawTypes.groupBy(_.projectId).toSeq.map(group => (group._1, group._2.slice(0, 10)))
    counts <- DBIO.sequence(types.map(aType => sql"""select count(*) from messages where type_id = ${aType.id}""".as[Int]))
  } yield (projectId, types.zip(counts))).transactionally

  1. for comprehension的第一行从types表中选择数据。
  2. 第二行应该对结果进行一些分组和切片,从而导致第三行的for comprehension必须对上一步中的每个元素执行一组查询,特别是,它必须对Seq[String]中的每个值执行一个for查询。因此,在第三行中,我构建了第二步中的DBIOActions.
  3. The yield子句ziptypes和第三步中的counts的序列。

然而,这种构造不起作用,并给出两个编译时错误:

Error:(129, 16) type mismatch;
 found   : slick.dbio.DBIOAction[(Option[String], Seq[(com.centreit.proto.repiso.storage.db.models.DBType#TableElementType, Vector[Int])]),slick.dbio.NoStream,slick.dbio.Effect]
    (which expands to)  slick.dbio.DBIOAction[(Option[String], Seq[(com.centreit.proto.repiso.storage.db.models.TypeModel, Vector[Int])]),slick.dbio.NoStream,slick.dbio.Effect]
 required: scala.collection.GenTraversableOnce[?]
        counts <- DBIO.sequence(types.map(aType => sql"""select count(*) from messages where type_id = ${aType.id}""".as[Int]))
               ^
Error:(128, 28) type mismatch;
 found   : Seq[Nothing]
 required: slick.dbio.DBIOAction[?,?,?]
        (projectId, types) <- rawTypes.groupBy(_.projectId).toSeq.map(group => (group._1, group._2.slice(0, 10)))
                           ^

我尝试使用DBIO.successful将第二行包装在DBIOAction中,这将把一个常量值提升到DBIOAction monad中:

(projectId, types) <- DBIO.successful(rawTypes.groupBy(_.projectId).toSeq.map(group => (group._1, group._2.slice(0, 10))))

但是在这段代码中,types变量被推断为Any,因此代码无法编译。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-03 04:29:24

这样试试:

val compositeAction = (for {
  rawTypes <- TableQuery[DBType].result
  pair <- DBIO.sequence(rawTypes.groupBy(_.projectId).toSeq.map(group => DBIO.successful(group)))
  counts <- DBIO.sequence(pair.head._2.map(aType => sql"""select count(*) from messages where type_id = ${aType.id}""".as[Int]))
} yield (pair.head._1, pair.head._2.zip(counts))).transactionally
票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31103813

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档