【发布时间】:2015-08-23 11:33:50
【问题描述】:
以下来自 Slick 2.1 的工作代码返回一个整数(在本例中,它恰好是运行名为“foobar”的函数的结果):
def getFoobar(): Int = DB.withSession {
val query = Q.queryNA[Int]("select foobar()")
query.first
}
如何将其移植到 Slick 3.0?根据 Slick 3.0 文档,必须将查询转换为 DBIOAction。所以这就是我尝试过的:
import driver.api._
...
def getFoobar(): Future[Int] = {
val query = sql"select foobar()".as[Int]
db.run(query)
}
但这会导致以下编译错误:
[error] found : slick.profile.SqlStreamingAction[Vector[Int],Int,slick.dbio.Effect]#ResultAction [Int,slick.dbio.NoStream,slick.dbio.Effect]
[error] required: MyDAO.this.driver.api.DBIO[Seq[Int]]
似乎 sql 插值器产生了 SqlStreamingAction 而不是 DBIO,正如 db.run 所期望的那样。
在新的 Slick 3 API 中编写此代码的正确方法是什么?
【问题讨论】:
-
所以看起来有点不对劲的是它需要
Seq[Int],您可以尝试将您的as 更改为.as[Seq[Int]].head吗?根据文档,您的查询应该可以工作,所以不确定可能还有什么其他问题。 -
经过一番试验,我得到了
sql"select foobar()".as[Int].head进行类型检查。这可能是正确的做法,但我不想关闭这个答案,直到我发现它在运行时表现正确。 -
@scrapdog 看看这个问题,它可能对你也有帮助stackoverflow.com/questions/32623875/…