В настоящее время я изучаю 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, поэтому извиняюсь, если я упустил что-то действительно очевидное.