【问题标题】:Slick - What if database does not contain resultSlick - 如果数据库不包含结果怎么办
【发布时间】:2016-04-11 02:03:58
【问题描述】:

我正在尝试构建一个简单的 RESTful 服务,该服务对数据库执行 CRUD 操作并返回 JSON。我有一项服务遵循这样的 API

GET mydomain.com/predictions/some%20string

我使用一个 DAO,其中包含我创建的以下方法来检索相关预测:

def getPrediction(rawText: String): Prediction = {
  val predictionAction = predictions.filter{_.rawText === rawText}.result
  val header = predictionAction.head
  val f = db.run(header)
  f.onComplete{case pred => pred}
  throw new Exception("Oops")
}

但是,这不可能,所以我开始阅读有关Option 的信息。我相应地更改了我的代码:

def getPrediction(rawText: String): Option[Prediction] = {
  val predictionAction = predictions.filter{_.rawText === rawText}.result
  val header = predictionAction.headOption
  val f = db.run(header)
  f.onSuccess{case pred => pred}
  None
}

这仍然感觉不太对劲。调用这些过滤器、返回结果和处理任何不确定性的最佳方式是什么?

【问题讨论】:

  • 哪个版本的 slick?
  • @marcospereira 3.1.1。我想我是通过添加return Some(red)return None 来解决的。我阅读了更多关于Option 的内容,并正在使用.isEmpty 来决定要做什么。我仍然对使用Slick 的最佳方式感到好奇,尽管文档似乎很模糊。例如,还有DBIO 序列。不确定哪个最好用。

标签: scala rest slick spray


【解决方案1】:

我认为重写代码的最好方法是这样的:

def getPrediction(rawText: String): Future[Option[Prediction]] = {
  db.run(users.filter(_.rawText === rawText).result.headOption)
}

换句话说,返回一个Future 而不是普通的结果。这样,数据库操作将异步执行,这是 Play 和 Akka 的首选方式。

然后客户端代码将使用Future。例如,Play 动作如下:

def prediction = Action.async {
  predictionDao.getPrediction("some string").map { pred =>
    Ok(views.html.predictions.show(pred))
  }.recover {
    case ex =>
      logger.error(ex)
      BadRequest()
  }
}

【讨论】:

  • 你的建议真的清理了我的 dao api,所以谢谢。我实际上正在使用 Spray,所以我在使用 onComplete 时遇到了一些麻烦,但我终于让它工作了,并且在这个过程中学到了很多关于 Futures 的知识。另外,_.rawText == 应该是_.rawText ===吗?
  • @BrianVanover 根据您的评论进行了小幅更正。另外,请随时编辑答案并添加如何将 dao 方法与 Spray 一起使用。 ;-)
  • @marcospereira 你为什么不直接写db.run(users.filter(_.rawText === rawText).result.headOption)
  • @MustafaSimav 是的。写得太快,没有注意到这一点。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-14
  • 1970-01-01
  • 1970-01-01
  • 2019-12-31
  • 2016-11-10
  • 2012-03-22
相关资源
最近更新 更多