";对",;在Play框架中使用write Slick 3.0 Scala查询的方法

";对",;在Play框架中使用write Slick 3.0 Scala查询的方法,scala,playframework,slick,Scala,Playframework,Slick,我使用的是Slick 3.0,当然,几乎所有的例子都涵盖了Slick 2.x。事情发生了变化,坦率地说,似乎变得越来越复杂,而不是越来越少 这里有一个例子:我想通过id获取一个对象(一个GPPerson)。这就是我现在拥有的,而且它似乎非常冗长。。。比Slick 2.x更重要的是: def get(id: GPID): Option[GPPerson] = Await.result( db.run( people.filter(_.id === id).result),

我使用的是Slick 3.0,当然,几乎所有的例子都涵盖了Slick 2.x。事情发生了变化,坦率地说,似乎变得越来越复杂,而不是越来越少

这里有一个例子:我想通过id获取一个对象(一个GPPerson)。这就是我现在拥有的,而且它似乎非常冗长。。。比Slick 2.x更重要的是:

def get(id: GPID): Option[GPPerson] = Await.result(
    db.run(
        people.filter(_.id === id).result), Duration.Inf
    ).headOption
在Slick2.x中,由于隐式,以及其他原因,事情变得更容易了。但上面这句话似乎是我想到的最简洁的表达

它也没有真正解决异常处理,我需要添加异常处理。

您可以这样做

def syncResult[R](action:slick.dbio.DBIOAction[R, slick.dbio.NoStream, scala.Nothing]):R = {
    import scala.concurrent.duration.Duration

    val db = Database.forConfig("db")
    try {
      Await.result(db.run(action), Duration.Inf)
    } finally db.close
  }

def get(id: GPID): Option[GPPerson] = syncResult { people.filter(_.id === id).result.headOption }

几个月前,我开始在一个新项目中使用Slick 3.0,我也有同样的问题。这就是我所理解的:

Slick 3.0是为非阻塞异步(反应)应用程序而设计的。显然,这意味着现在的Akka+游戏/喷雾。在这个世界上,您主要与期货互动,这就是为什么Slick的db.run返回未来。使用Await.result没有意义——如果需要阻塞调用,最好返回到2.x

但如果您使用反应式堆栈,您将立即获得好处。例如,Spray是一个完全非阻塞的库,它可以使用指令进行操作。您可以调用一个方法,该方法返回Future,结果来自喷洒路线中的Slick,然后将该结果与onComplete一起使用。在这种情况下,整个响应管道是非阻塞的

您还提到了异常处理,所以这正是您所要做的-使用Futures

因此,根据我的经验,我将以以下方式编写您的方法:

def get(id: GPID): Future[Option[GPPerson]] = db.run(
  people.filter(_.id === id).result.map(_.headOption)
)

然后与未来合作

为了清楚起见,您正在使用
wait.result
阻塞线程。你可能知道,但在代码中看到它很可怕。我知道——Typesafe中所有光滑的3.0示例都是这样做的……好吧,这确实让它更干净了一点。。。但正如上面所指出的,这是一个阻塞调用这一事实又如何呢?看起来我看过的所有光滑的3.0示例都使用这种模式,但是。。。堵住了。这似乎大错特错。而且,看起来Slick 3.0走错了方向,使得调用起来更困难,而不是更容易。。。但也许API中有一些变化我还没有发现。文件是“模糊的和不完整的…”未来是不是直接以行动返回?例如,现在,我有一些操作使用wait来完成查询。例如,我将执行
valr=db.run(glimpleAction);wait.result(r,Duration.Inf)
在操作中。。。我会不会只是等待,然后玩得足够聪明,可以应付这样的后果?(但这并不是那么简单,因为我可以使用
wait.result(r,Duration.Inf).toSeq
来获取序列。我如何在web服务操作中返回未来?)您肯定不需要wait.result。在Slick中为我编写查询的标准方法:
db.run(some_query.result)
这将返回type
Future[Seq[SomeQueryType]
。关于游戏-您需要使用
Action.async
才能在您的操作中使用期货,更多详细信息: