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

How do you return multiple items from a Slick query?

如何在使用 slick 时 return 处理查询结果?我是 return 一个元组,还是 return 一个查询对象,但拆分成多个会话?

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

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不在范围内。我意识到我可以 return 来自 db.withSession 的东西:

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

但是多个查询呢?我应该 return 他们在一个元组中吗?

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)
} 

这是正确的做法吗?我真的很难找到解决这个问题的正确方法。

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

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)
}