Slick - 如果数据库不包含结果怎么办
Slick - What if database does not contain result
我正在尝试构建一个简单的 RESTful 服务,该服务对数据库和 returns JSON 执行 CRUD 操作。我有一项服务遵循这样的 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
}
感觉还是不太对。调用这些过滤器、return 结果和处理任何不确定性的最佳方法是什么?
我认为重写代码的最佳方式是这样的:
def getPrediction(rawText: String): Future[Option[Prediction]] = {
db.run(users.filter(_.rawText === rawText).result.headOption)
}
换句话说,return 一个 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()
}
}
我正在尝试构建一个简单的 RESTful 服务,该服务对数据库和 returns JSON 执行 CRUD 操作。我有一项服务遵循这样的 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
}
感觉还是不太对。调用这些过滤器、return 结果和处理任何不确定性的最佳方法是什么?
我认为重写代码的最佳方式是这样的:
def getPrediction(rawText: String): Future[Option[Prediction]] = {
db.run(users.filter(_.rawText === rawText).result.headOption)
}
换句话说,return 一个 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()
}
}