Scala 如何将Slick 2.1普通SQL查询移植到Slick 3.0
Slick 2.1中的以下工作代码返回一个整数(在本例中,该整数恰好是运行名为“foobar”的函数的结果): 如何将其移植到Slick 3.0?根据Slick 3.0文档,查询必须转换为DBIOAction。这就是我尝试过的:Scala 如何将Slick 2.1普通SQL查询移植到Slick 3.0,scala,slick,Scala,Slick,Slick 2.1中的以下工作代码返回一个整数(在本例中,该整数恰好是运行名为“foobar”的函数的结果): 如何将其移植到Slick 3.0?根据Slick 3.0文档,查询必须转换为DBIOAction。这就是我尝试过的: import driver.api._ ... def getFoobar(): Future[Int] = { val query = sql"select foobar()".as[Int] db.run(query) } 但这会导致以下编译错误
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中,写这篇文章的正确方法是什么?我使用了类似的东西,它对我很有用
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配置步骤,这样我们就可以更深入地了解代码,以确定实际的错误步骤,所以有一点似乎有点不对劲,那就是它需要
Seq[Int]
,您可以尝试将as更改为。as[Seq[Int]]。head
?根据文档,您的查询应该可以工作,因此不确定可能还有什么其他问题。经过一点实验,我得到了sql“select foobar()”。作为[Int]。头进行类型检查。这可能是正确的方法,但我不想关闭此答案,直到我发现它在运行时的行为正确为止。@scrapdog看看这个问题,它可能也会帮助您
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)
}
[error] required: MyDAO.this.driver.api.DBIO[Seq[Int]]