scala - 如何使用 Slick 的 insertOrUpdate 返回整行

标签 scala slick-3.0 playframework-2.5

我目前正在学习 Play2、Scala 和 Slick 3.1,并且对使用 insertOrUpdate 的语法非常困惑,想知道是否有人可以帮助我。

我想要做的是在使用 insertOrUpdate 时返回完整行,包括 auto inc 主键,但我只设法返回更新/插入的行数。

这是我的表定义:

package models

final case class Report(session_id: Option[Long], session_name: String, tester_name: String, date: String, jira_ref: String,
                  duration: String, environment: String, notes: Option[String])

trait ReportDBTableDefinitions {

  import slick.driver.PostgresDriver.api._

  class Reports(tag: Tag) extends Table[Report](tag, "REPORTS") {

    def session_id = column[Long]("SESSION_ID", O.PrimaryKey, O.AutoInc)
    def session_name = column[String]("SESSION_NAME")
    def tester_name = column[String]("TESTER_NAME")
    def date = column[String]("DATE")
    def jira_ref = column[String]("JIRA_REF")
    def duration = column[String]("DURATION")
    def environment = column[String]("ENVIRONMENT")
    def notes = column[Option[String]]("NOTES")

    def * = (session_id.?, session_name, tester_name, date, jira_ref, duration, environment, notes) <> (Report.tupled, Report.unapply)
  }

  lazy val reportsTable = TableQuery[Reports]

}

这是我的 DAO 中与 insertOrUpdate 相关的部分,它工作得很好,但只返回更新/插入的行数:

package models

import com.google.inject.Inject
import play.api.db.slick.DatabaseConfigProvider
import scala.concurrent.Future

class ReportsDAO @Inject()(protected val dbConfigProvider: DatabaseConfigProvider) extends DAOSlick {

  import driver.api._

  def save_report(report: Report): Future[Int] = {
    dbConfig.db.run(reportsTable.insertOrUpdate(report).transactionally)
  }
}

我尝试过使用“返回”,但我无法获得所需的语法,并且不断出现类型不匹配的情况,例如下面的代码无法编译(因为它可能完全错误!)

 def save_report(report: Report): Future[Report] = {
    dbConfig.db.run(reportsTable.returning(reportsTable).insertOrUpdate(report))
  }

感谢任何帮助 - 我是 Scala 和 Slick 的新手,所以如果我遗漏了一些非常明显的东西,我深表歉意。

最佳答案

已解决 - 发布它以防止其他人尝试做类似的事情:

//will return the new session_id on insert, and None on update
  def save_report(report: Report): Future[Option[Long]] = {
    val insertQuery = (reportsTable returning reportsTable.map(_.session_id)).insertOrUpdate(report)
    dbConfig.db.run(insertQuery)
  }

效果很好 - insertOrUpdate 在更新时不会返回任何内容,因此如果我需要在更新操作后获取更新的数据,我可以运行后续查询以使用 session ID 获取信息。

关于scala - 如何使用 Slick 的 insertOrUpdate 返回整行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39210744/

相关文章:

sbt - 进化会自动创建数据库和表吗?

scala - 如何在光滑表映射中省略案例类字段?

scala - 在 Play 框架 2.5 (Scala) 中使用 CSRF token 测试请求

playframework - 如何使用 JavaScript 变量作为 @Messages 的参数

scala - 如何编写被枚举者沿不同边界对枚举器进行分块

scala - 从 Spark 中具有不同架构的现有数据帧创建另一个数据帧

scala - Slick 3.0.0 - 如何使用 joinLeft 对查询进行排序

java - Play 2.5 错误 - CompletionStage<WSResponse> 无法转换为 F.Promise<WSResponse>

scala - jvm 选项未传递给 fork 进程

Scala 文件编译但不会在 Scala 2.11.12 和 JDK 11 上作为脚本运行