如何从Slick查询中返回多个项目?

时间:2015-04-12 21:40:57

标签: scala slick

使用光滑时,如何返回查询结果?我是否返回一个元组,或返回一个查询对象,但是分成多个会话?

这里让我困惑的是:在我的索引控制器中,我创建了数据库连接和隐式会话。

val db = Database.forURL("db.default.url", driver = "db.default.driver")
db.withSession {implicit session => ...}

然后我可以在withSession容器内查询我的心脏。

db.withSession {implicit session => 
  val coolStuff = myStuff.sortBy(_.name).drop(1).take(10).list
}

但是,我不确定如何获得隐式会话的结果 out 。我不能这样做

def index = Action {
   val db = Database.forURL("db.default.url", driver = "db.default.driver")
    db.withSession {implicit session =>
      myStuff.sortBy(_.name).drop(1).take(10).list
    }
  Ok(views.html.index(myStuff)
} 

因为myStuff不在范围内。我意识到我可以从db.withSession返回内容:

val coolStuff = db.withSession {implicit session => ..blah } 

但是多个查询呢?我应该以元组的形式归还吗?

def index = Action {
   val db = Database.forURL("db.default.url", driver = "db.default.driver")
    val results = db.withSession {implicit session =>
      val myStuff = myStuff.sortBy(_.name).drop(1).take(10).list
      val otherStuff = myStuff.filter(_.name != "myname").take(10).list
      (myStuff, otherStuff)
    }
  val myStuff = results(0)
  val otherStuff = results(1)
  Ok(views.html.index(myStuff)
} 

这是正确的方法吗?我很难找到正确的解决方法。

1 个答案:

答案 0 :(得分:3)

您可以任意方式退货。一个元组非常好。注意Scala的提取器语法,它可以为您节省一些锅炉。另请注意,可以在withSession块之外指定查询。只有.list或.run需要在里面。

val myStuffQuery = myStuff.sortBy(_.name).drop(1).take(10)
val otherStuffQuery = myStuff.filter(_.name != "myname").take(10)
val (myStuff,otherStuff) = db.withSession {implicit session =>
  (myStuffQuery.run, otherStuffQuery.run)
}