光滑的头部选择无所事事

时间:2015-07-24 13:27:58

标签: slick play-slick

我有一个简单的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时我应该收到一些(regPeriod)吗?

修改

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

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,一切都会按预期运行。

1 个答案:

答案 0 :(得分:4)

.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]