将 Slick 2.1 StaticQuery 迁移到 Slick 3.1

Migrating Slick 2.1 StaticQuery to Slick 3.1

我正在尝试在 Play 应用程序中将一些代码从 Slick 2.1 迁移到 Slick 3.1,DBIO Actions 上的文档完全让我头疼。我很难在网上的任何地方找到展示如何将 StaticQuery 的使用迁移到 Slick 3.1 的示例。这是我在 Slick 2.1 中的代码:

import scala.slick.jdbc.{GetResult, StaticQuery => Q}
...
object RegionTable {
  ...
  def selectSomething(param1: Double, param2: Double): List[Region] = db.withSession { implicit session =>
    val selectSomethingQuery = Q.query[(Double, Double), Region](
      """SELECT ...""".stripMargin
    )
    selectSomethingQuery((param1, param2)).list
  }
}

Link 到完整代码:

https://github.com/ProjectSidewalk/SidewalkWebpage/blob/master/app/models/region/RegionTable.scala

类似问题:

How to use StaticQuery in Slick 3.0.0?

How to port Slick 2.1 plain SQL queries to Slick 3.0

文档和有用的博客文章

http://slick.lightbend.com/doc/3.0.0/upgrade.html

http://slick.lightbend.com/doc/3.1.1/upgrade.html

http://slick.lightbend.com/doc/3.1.1/dbio.html

https://grokbase.com/t/gg/scalaquery/15250knfya/slick-3-removes-withsession-dont-get-caught-by-surprise

例如你有案例 class Region

case class Region(id: Int, name: String, code: String)

第一步,您需要通过提供 GetResult 隐式对话来告诉 slick 如何将 sql 结果映射到您的案例 class:

implicit val regionGetResult = GetResult(r => Region(r.nextInt, r.nextString, r.nextString))

你应该构建 DBIOAction:

val selectAction = sql"""select * from regions where name = ${param1} and code = ${param2}""".as[Region]

这将 return 你 DBIO[Seq[Region]]。现在您可以使用 db 对象执行此操作并得到 Future[Seq[Region]] 作为结果:

db.run(selectAction).map(regions => ...)