Slick 3.0.3 警告:特性 DatabaseFactoryDe​​f 中的方法 dynamicSession 已弃用

Slick 3.0.3 warning: method dynamicSession in trait DatabaseFactoryDef is deprecated

我正在使用 Slick 3.0.3,我很满意 Plain SQL 方法将结果集映射到案例 类。但是,以下代码会产生警告 method dynamicSession in trait DatabaseFactoryDef is deprecated: Use the new Action-based API instead。在研究了 Slick 文档和 migration jungles 之后,我仍然需要找到它们对 "new Action-based API" 的含义。这是什么干净、无警告的版本?

import play.api.db.DB
import slick.driver.PostgresDriver.backend.Database._
import slick.jdbc.{StaticQuery => Q}
import play.api.Play.current

import models.Tables._

class InstrumentDao {
  def countAllInstruments(): Int = DB.withConnection() { implicit conn =>
    Q.queryNA[Int](s"""select count(*) from "${Instrument.baseTableRow.tableName}"""").first
  }
}

新的 API 是通过 {driver}.api._ 包导入的。 Slick 3 是完全异步的,它 returns Future 实例用于任何 运行 使用此 API 的操作,因此您需要更改 return 类型你的功能相应。只需在 Database 实例上使用 run 函数,并在语句中将使用 result 方法创建的 DBIOAction 实例传递给它;使用字符串插值器创建实际语句的示例可以是:

import play.api.db.DB
import scala.concurrent.Future
import slick.driver.PostgresDriver.api._
import play.api.Play.current

import models.Tables._

class InstrumentDao {
  def countAllInstruments(): Future[Int] = db.run(sql"""select count(*) from "${Instrument.baseTableRow.tableName}"""".result.head)
}