Slick 3.0:从Option(Scala Play Framework)内的数据库获取GET结
发布时间:2020-12-16 08:58:35 所属栏目:安全 来源:网络整理
导读:我有一个API的代码,允许我从数据库中检索和对象,并使用Slick 3.0返回一个 JSON对象: // Modelcase class Thing(id: Option[Int],name: String)object Thing { implicit val teamWrites = Json.writes[Thing]}class Things(tag: Tag) extends Table[Thing](t
我有一个API的代码,允许我从数据库中检索和对象,并使用Slick 3.0返回一个
JSON对象:
// Model case class Thing(id: Option[Int],name: String) object Thing { implicit val teamWrites = Json.writes[Thing] } class Things(tag: Tag) extends Table[Thing](tag,"thing") { def id = column[Int]("id",O.PrimaryKey,O.AutoInc) def name = column[String]("name") def * = (id.?,name) <> ((Thing.apply _).tupled,Thing.unapply) } object Things { private val db = Database.forConfig("h2mem1") private object things extends TableQuery[Things](tag ? new Things(tag)) { def all = things.result } private def filterQuery(id: Int): Query[Things,Thing,Seq] = things.filter(_.id === id) def findById(id: Int): Future[Thing] = db.run(filterQuery(id).result.head) } // Controller class ThingController extends Controller { def get(id: Int) = Action.async { Things.findById(id).map(thing => Ok(Json.obj("result" -> thing))) } } 问题是如果我查询不在数据库中的对象,我会得到一个例外.我想要做的是在Model中返回一个从Model返回的Option,以便能够编写如下内容: // Controller class ThingController extends Controller { def get(id: Int) = Action.async { Things.findById(id).map { case None => NotFound(Json.obj("error" -> "Not Found"))) case Some(thing) => Ok(Json.obj("result" -> thing))) } } } 是否有意义? 解决方法
只需在结果上调用headOption而不是head:
def findById(id:Int):Future [Option [Thing]] = db.run(filterQuery(id).result.headOption) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- 【数据结构】map和pair的配合使用
- angularjs自定义directive指令的priority、terminal参数说明
- AngularJS使用templateHtml的路径作为模块名称
- 输入框和导航组件
- 网络 – 使用Docker的Centos VM在尝试连接自身时无法访问主
- angularjs – 将D3.js(可折叠树)集成到Angular应用程序中有
- bootstrap ace treeview组件的使用
- bootstrap中 刷新页面,tab页选中不改变。
- angular2(4) 中动态创建组件的两种方案
- scala – sbt 0.11.2如何将~copy-resources与~aux-compile结