【问题标题】:tuple result in slick 3 DBIO元组导致光滑的 3 DBIO
【发布时间】:2018-05-10 08:51:43
【问题描述】:

有一个包含键、值的表。

还有一个自动递增 PK 的表。

从第一个表中获取键的值。如果不存在插入和 返回默认值。 根据它查询其他表。

返回过滤结果和值。

所以我可以试试:

def lastLogs(limit: Long = 666): Future[(Long, Seq[VLogEntry])] = {
  val q: DBIO[(Long, Seq[VLogEntry])] = {
    for {
      existing <- kvTable.filter(_.key === "log").result.headOption
      conf = existing getOrElse KV(key = "log", value = "0")
      last = conf.value.toLong
      rds = vLogTable.filter(_.id > last).take(limit).result
      _ <- kvTable.insertOrUpdate(conf)
    } yield {
      (last, rds)
    }
  }
  db.run(q)
}

这会产生编译错误:

found   : HipDAO.this.domain.dbConfig.profile.StreamingProfileAction[Seq[HipDAO.this.domain.VLogTable ...

required: Seq[db.types.Types.VLogEntry]

在 Slick 2 中,我可以在会话中调用 list 或 result 查询。 我如何在 Slick 3 中做到这一点。

【问题讨论】:

  • 您的rds = 应该是rds &lt;- 。不确定这是否能解决所有问题,查看完整错误以及报告的位置会很有用。
  • 谢谢。实际上,我在写这篇文章后就想到了,但留下它以防有人提出如何阅读此错误消息。

标签: scala slick-3.0


【解决方案1】:

通过迭代我可以做的事情:

def lastLogs(limit: Long = 666): Future[(Long, Seq[VLogEntry])] = {
  val q: DBIO[(Long, Seq[VLogEntry])] = {
    for {
      existing <- kvTable.filter(_.key === "log").result.headOption
      conf = existing getOrElse KV(key = "log", value = "0")
      _ <- kvTable.insertOrUpdate(conf)
      last = conf.value.toLong
      rds <- vLogTable.filter(_.id > last).take(limit).result
    } yield {
      (last, rds)
    }
  }
  db.run(q)
}

由于差异只有 2 个字符,这似乎很容易解决。 互联网没有StreamingProfileAction 是什么,以及如何阅读此消息。 阅读essential slick 3

可能会有所启发

最后,我怎么看,它是一个 monad,你应该对它进行 flatMap。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-04
    • 1970-01-01
    相关资源
    最近更新 更多