Play Slick 2.1.0 Эта СУБД позволяет возвращать только один столбец AutoInc из команды INSERT.

В следующем коде я могу вставить свои записи просто отлично. Но я бы очень хотел вернуть идентификатор вставленного значения, чтобы затем вернуть объект как часть моего ответа.

def postEntry = DBAction { request =>
  request.body.asJson.map {json =>
    json.validate[(String, Long, String)].map {
      case (name, age, lang) => {
        implicit val session = request.dbSession
        val something = Entries += Entry(None, name, age, lang)
        Ok("Hello!!!: " + something)
      }
    }.recoverTotal {
    e => BadRequest("Detected error: " + JsError.toFlatJson(e))
    }
   }.getOrElse {
   BadRequest("Expecting Json data")
  }
}

Поэтому я попытался изменить вставку на:

 val something = (Entries returning Entries.map(_.id)) += Entry(None, name, age, lang)

Но я получаю следующее исключение:

SlickException: This DBMS allows only a single AutoInc column to be returned from an INSERT

Здесь есть примечание об этом: http://slick.typesafe.com/doc/2.1.0/queries.html

«Обратите внимание, что многие системы баз данных позволяют возвращать только один столбец, который должен быть автоматически увеличивающимся первичным ключом таблицы. Если вы запрашиваете другие столбцы, во время выполнения выдается исключение SlickException (если только база данных на самом деле не поддерживает его)».

Но не сказано, как просто запросить столбец идентификатора.


person Eric Goode    schedule 29.08.2014    source источник
comment
Разве у Entries нет первичного ключа? Я не думаю, что ваш столбец id тот самый, вы передаете None в Entry, что заставляет меня думать, что это необязательно.   -  person Ende Neu    schedule 30.08.2014
comment
Спасибо! Вы заставили меня задуматься о моей карте, и я вернулся и проверил ее. Мне удалось откатить определение первичного ключа и определение автоматического увеличения при отображении таблицы.   -  person Eric Goode    schedule 30.08.2014


Ответы (1)


Ende Nue выше дал мне подсказку, чтобы найти проблему. Мне нужно было, чтобы столбец был помечен первичным ключом и автоматически увеличивался в определении таблицы.

class Entries(tag: Tag) extends Table[Entry](tag, "entries") {

  def id = column[Option[Long]]("id", O.PrimaryKey, O.AutoInc)
  def name = column[String]("name")
  def age = column[Long]("age")
  def lang = column[String]("lang")

  def * = (id, name, age, lang).shaped <> ((Entry.apply _)tupled, Entry.unapply _)
}

O.PrimaryKey, O.AutoInc

person Eric Goode    schedule 29.08.2014
comment
Это все еще не решает мою проблему. Это решение исправило ошибку для вас? - person Maverick; 13.07.2016
comment
Это лучший обзор проблемы github.com/slick/slick/issues/1561 - person rusia.inc; 26.04.2017