2016-04-07 2 views
8

Я пытаюсь сделать вставку в таблицу MySQL и вернуть строку с идентификатором auto increment. Мой код ниже:Slick: возвращает вставленную строку с auto increment id

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 

[Я ответил на вопрос How to catch slick postgres exceptions for duplicate key value violations и документация Slick здесь http://slick.typesafe.com/doc/3.1.1/queries.html]

Очень ценится, если кто-то может сказать мне, что происходит, и как это можно исправить.

Спасибо!

+1

Я думаю, ваша проблема (несоответствие типов), потому что вы на самом деле не работает запрос '' 'db.run (.. .) '' '. –

+0

@MirkoStocker db.run работает (с другим синтаксисом), но есть ли способ вернуть вставленную строку, если я использую db.run? – shyam

+0

Так что же ваш код в настоящее время возвращает, когда вы делаете db.run? –

ответ

3
def save(log: GCMLog): Try[GCMLog] = Try { 
    (Log returning Log.map(_.id)) 
     into ((log, newId) => log.copy(id = newId)) 
     ) += log 
    } 

UPDATE:

Это выглядит db.run необходимо выполнить, чтобы преобразовать его Action в результате.

+0

Не работает. Я отредактировал свой вопрос с ошибкой. – shyam

+0

@shyam Похоже, 'db.run' нужно сделать, чтобы преобразовать' Action' в результат – TheKojuEffect

+0

Пытаясь по-другому, все еще не может заставить его работать. :( – shyam

1

пятно поддерживает его:

def create(objectToCreate: MyCaseClass): MyCaseClass = { 
    db.withSession { 
     (self returning self) += objectToCreate 
    } 
    } 
1

Попробуйте

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) 
}