Slick: возврат вставленной строки с автоматическим приращением id
Я пытаюсь сделать вставку в таблицу MySQL и вернуть строку с идентификатором автоматического приращения. Мой код ниже:
private val Log = TableQuery[GCMLogTable]
def save(log: GCMLog): Try[GCMLog] = Try {
val newId = (Log returning Log.map(_.id)) += log
log.copy(id = newId)
}
но моя компиляция завершается с ошибкой для моего кода с ошибкой ниже:
type mismatch;
found : slick.profile.FixedSqlAction[Long,slick.dbio.NoStream,slick.dbio.Effect.Write]
required: Long
тоже пробовал
def save(log: GCMLog): Try[GCMLog] = Try {
(Log returning Log.map(_.id)
into ((log, newId) => log.copy(id = newId))
) += log
}
но все равно выдает
type mismatch;
found : slick.profile.FixedSqlAction[models.GCMLog,slick.dbio.NoStream,slick.dbio.Effect.Write]
required: models.GCMLog
[Я передал так вопрос как поймать Слик postgres исключения для повторяющихся нарушений ключевых значений и скользкая документация здесь http://slick.typesafe.com/doc/3.1.1/queries.html ]
гораздо признателен, если кто-то может сказать мне, что происходит и как это можно исправить.
спасибо!
3 ответов
def save(log: GCMLog): Try[GCMLog] = Try {
(Log returning Log.map(_.id))
into ((log, newId) => log.copy(id = newId))
) += log
}
обновление:
выглядит db.run
необходимо выполнить, чтобы преобразовать Action
в результате.
Слик поддерживает его:
def create(objectToCreate: MyCaseClass): MyCaseClass = {
db.withSession {
(self returning self) += objectToCreate
}
}
попробуй такое
private val Log = TableQuery[GCMLogTable]
private val db = Database.forConfig("mysql")
def save(log: GCMLog): Try[GCMLog] = Try {
val newId = db.run((Log returning Log.map(_.id) into ((Log,id) => Log.copy(id=id))) += log)
Await.result(newId, Duration.Inf)
}