我有一个简单的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
,一切都会按预期运行。
答案 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]