【问题标题】:How to port Slick 2.1 plain SQL queries to Slick 3.0如何将 Slick 2.1 纯 SQL 查询移植到 Slick 3.0
【发布时间】: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/…

标签: scala slick


【解决方案1】:

我用过类似的东西,它对我有用

import slick.driver.MySQLDriver.api._

def get(id : String) : Future[Channel] = {
implicit val getChannelResult = GetResult(r => Channel(r.<<, r.<<, r.<<, r.<<, r.<<))
val query = sql"select * from Channel where id = $id".as[Channel]
db.run(myq.headOption)
}

db.run(DBIOAction[T,NoStream,Nothing]) 命令将接受所有类型的操作,如 sqlstreamingaction 、 StreamingDriverAction 、 DriverAction 等。

我猜问题出在驱动程序或数据库配置上。所以报错

[error]  required: MyDAO.this.driver.api.DBIO[Seq[Int]]

你能把驱动和数据库配置步骤粘贴一下,这样我们就可以更深入地查看代码来识别实际的错误步骤

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-19
    • 2017-12-14
    相关资源
    最近更新 更多