gpt4 book ai didi

scala - "right"在 Play Framework 中使用 write Slick 3.0 Scala 查询的方法

转载 作者:行者123 更新时间:2023-12-04 15:10:20 24 4
gpt4 key购买 nike

我正在使用 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

在 Slick 2.x 中,由于隐含等,事情变得更容易了。但以上似乎是我想出的最简洁的表达方式。

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

最佳答案

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

Slick 3.0 是为非阻塞异步(响应式(Reactive))应用程序设计的。显然,它现在意味着 Akka + Play/Spray。在这个世界中,您主要与 Futures 交互,这就是 Slick 的 db.run 返回 Future 的原因。使用 Await.result 毫无意义——如果您需要阻塞调用,最好返回 2.x。

但是如果您使用响应式(Reactive)堆栈,您将立即获得好处。例如,Spray 是完全非阻塞的库,可以很好地使用 onComplete 与 Futures 配合使用。指示。您可以调用一个方法,该方法返回 Future 并在 Spray 路由中使用来自 Slick 的结果,然后将该结果与 onComplete 一起使用。在这种情况下,整个响应-回复管道是非阻塞的。

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

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

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

然后与 Future 一起工作。

关于scala - "right"在 Play Framework 中使用 write Slick 3.0 Scala 查询的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30339825/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com