jnh*_*ton 6 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]
}Run Code Online (Sandbox Code Playgroud)
这是我的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)
}
}Run Code Online (Sandbox Code Playgroud)
我试过玩"返回",但我无法得到我需要的语法,并继续得到类型不匹配,例如下面的不编译(因为它可能是完全错误的!)
def save_report(report: Report): Future[Report] = {
dbConfig.db.run(reportsTable.returning(reportsTable).insertOrUpdate(report))
}Run Code Online (Sandbox Code Playgroud)
任何帮助表示赞赏 - 我是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)
}Run Code Online (Sandbox Code Playgroud)
效果很好 - insertOrUpdate 在更新时不会返回任何内容,因此如果我需要在更新操作后获取更新的数据,我可以运行后续查询以使用会话 ID 获取信息。
| 归档时间: |
|
| 查看次数: |
2008 次 |
| 最近记录: |