在 slick 中理解的 Future 和 Option

奥列格·季诺维也夫

我刚开始使用 slick,现在我面临着如何从两个表中检索一些数据的问题。我有一张桌子

class ExecutionTable(tag: Tag) extends Table[ExecTuple](tag, "execution") {
  val id: Rep[String] = column[String]("id")
  val executionDefinitionId: Rep[Long] = column[Long]("executionDefinitionId")
  // other fields are omitted

  def * = ???
}

和另一张桌子

class ServiceStatusTable(tag: Tag)
  extends Table[(String, Option[String])](tag, "serviceStatus") {
  def serviceId: Rep[String] = column[String]("serviceId")
  def detail: Rep[String] = column[String]("detail")

  def * = (serviceId, detail.?)
}

在 Dao 中,我将这两个表中的数据转换为一个业务对象

case class ServiceStatus(
  id: String, 
  detail: Option[String] = None, //other fields
)

像这样

private lazy val getServiceStatusCompiled = Compiled {
  (id: Rep[String], tenantId: Rep[String]) =>
  for {
    exec   <- getExecutionById(id, tenantId)
    status <- serviceStatuses if exec.id === status.serviceId
  } yield mapToServiceStatus(exec, status)
}

然后

def getServiceStatus(id: String, tenantId: String)
: Future[Option[ServiceStatus]] = db
  .run(getServiceStatusCompiled(id, tenantId).result.transactionally)
  .map(_.headOption)

问题是,并非表中的所有条目都execution存在表中的条目serviceStatus我无法修改表execution并向其添加字段,details因为它只是特定于服务的。当我运行查询时,以防万一从execution存在条目中的条目serviceStatus按预期工作。但如果 中没有条目serviceStatus,则返回 Future[None]。问题:status根据表中的现有条目serviceStatus或其他一些解决方法,是否有任何选项可以作为选项获得理解

尼亚夫罗

通常,如果连接条件在“右”表中找不到对应的记录,但结果仍应包含“左”表中的行,则使用左连接。在您的情况下,您可以执行以下操作:

Execution
  .filter(...execution table filter...)
  .joinLeft(ServiceStatus).on(_.id===_.serviceId)

这给你一对

(Execution, Rep[Option[ServiceStatus]]) 

并在查询执行后:

(Execution, Option[ServiceStatus])      

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Scala用于理解Future,List和Option

用于理解Future [Option [T]]并根据条件执行后续的Future

如何在Slick 3中的DBIOAction组成内使用Future?

Scalaz:如何链接Future [List [A]],Option [A]和Future [Option [A]]并报告单个错误

在 Scala 中解包 Future[Option[MyType]]

了解reactMongo中的Future [Option [T]]

IO和Future [Option] monad变压器

如何在Slick中的Option [Boolean]列上进行过滤

如何使Option [Int]保存在scala slick中

Scalaz中的Future [Option [List [List [Double]]]到Future [Option [List [List [Double]]]]

Slick中的子查询,Having和GroupBy

Slick Grid中的汇总标题和列

如何在Scala中展平未来-“ val _2flat:Future [Option [Future [List [Long]]]]

C ++中的std :: promise和std :: future

Slick中的inSet和inSetBind有什么区别

如何在Slick交易中混合选择和删除

无法在Slick Carousel中更改nextArrow和prevArrow

结合OptionT和EitherT来处理Future [Either [Error,Option [T]]]

Scala Slick和SQLite

Slick 3.0:从Option(Scala Play框架)内部的数据库中获取结果的惯用方式

使用React和React-Slick,我只是很难理解如何使用它

展平Future的Option部分

由ReaderT包装的带有Option和Some的Scala理解

bash中的“ for option”和bash中的echo

Scala:递归Future的理解

Future.zip和Future.zipWith实现中的细微差别。为什么?

Flutter 中调用 Future 和 Future.microtask 有什么区别?

Python中的__future__和swagger_client问题

协程和Python 3.5中的future / task之间的区别?