【问题标题】:Slick headOption doing nothingSlick headOption 什么都不做
【发布时间】:2015-07-24 13:27:57
【问题描述】:

我有一个简单的 MySQL 数据库,在 REG_PERIODS 表中有一行。当我运行此查询时,我会返回该行。

val getRegPeriodAction = regPeriods.sortBy(_.endDate).result.head.map { regPeriod ⇒
  Logger.debug(s"regPeriod = ${regPeriod}")

  regPeriod
}

但是,当我运行此查询时,我什么也得不到,实际上甚至没有到达调试消息!

val getRegPeriodAction = regPeriods.sortBy(_.endDate).result.headOption.map { regPeriodOption ⇒
  Logger.debug(s"regPeriodOption = ${regPeriodOption}")

  regPeriodOption match {
    case Some(regPeriod) ⇒ regPeriod
  }
}

我正在使用 play-slick 1.0.0。我在这里误解了什么吗?使用 headOption 时我应该收到 Some(regPeriod) 吗?

编辑

我尝试在db.run( ... ) 中运行headOption 查询并将结果发送到另一个函数,如下所示:

def handleResult(opt: Option[RegistrationPeriod]) {
  Logger.debug(s"received $opt")
}

for {
  r <- db.run( regPeriods.sortBy(_.endDate.desc).result.headOption )
  _ <- handleResult( r )
} ...

奇怪的是,handleResult 从来没有被调用过!一旦我将代码更改为调用head 而不是headOption,一切都会按预期工作。

【问题讨论】:

  • 您的问题已经解决了吗?你确定result.headOption 返回一个非空的Option 吗?仅当 Option 有值时才会调用 handleResult()。
  • 噢!当然,它会返回 None 并且因为 handleResult 处于 for 理解中,所以它没有被调用!在处理结果之前,我需要检查r 的值。

标签: slick play-slick


【解决方案1】:

.result 不会在数据库上执行您的查询。它创建了一个动作,必须传递给db.run() 或db.stream() 才能执行它:

val action = regPeriods.sortBy(_.endDate).result.headOption
val result: Future[Option[RegPeriod]] = db.run(action)

// accessing your data
result.map(r => r....)  // r is of type Option[RegPeriod]

【讨论】:

  • 感谢您的快速回答,不幸的是,这不是导致问题的原因。查看我的编辑
猜你喜欢
  • 2013-07-31
  • 2019-03-08
  • 2016-12-24
  • 2017-04-18
  • 2011-08-03
  • 2014-05-11
  • 2014-09-10
  • 1970-01-01
  • 2023-03-29
相关资源
最近更新 更多