Возврат значения с автоматическим увеличением после вставки с использованием slick

Я использую slick 2.0.1 (и при необходимости могу обновить), и я хочу получить значение автоматического увеличения из базы данных (postgresql).

Я уже видел несколько вопросов на SO по этому поводу, но они довольно старые, и я надеялся, что есть лучший способ, чем делать то, что предлагает этот ответ: Scala & Play! & Автоинкремент Slick & PostgreSQL

def autoInc = name ~ price ~ description returning id

def add(product: Product)(implicit s:Session): Long = {
    Products.autoInc.insert(p.name, p.price, p.description)
}

Вы должны повторно ввести поля модели в методе autoInc, который дублирует вещи, которых я надеюсь избежать.

Есть ли лучший способ или мне следует сделать это так?

Я выбрал способ, которым мои модели poso (простые старые объекты scala, такие как):

case class Product(.....)

И тогда мой класс дао выглядит так:

class ProductDao extends ProductDao {
  class Products(tag: Tag) extends Table[Product](tag, "products") {

     def id = ...
     def name = ..

     def * = (id, name) <> (Product.tupled, Product.unapply)

  }

  val products = TableQuery()
}

Также в качестве примечания: для метода * мне нужно вводить все подобные свойства или для этого есть лучший способ?


person Blankman    schedule 29.05.2014    source источник


Ответы (1)


Шаблон проекции autoInc или forInsert, который вы видели, относится к Slick 1, но не к Slick 2, где автоматически увеличивающиеся значения автоматически игнорируются при вставках. См. http://slick.typesafe.com/doc/2.0.2/migration.html#inserting

Можете ли вы лучше, чем повторять имена столбцов? Или несколько проявлений артефактов вашей модели данных, если уж на то пошло? Генерация кода — один из способов сделать это: http://slick.typesafe.com/doc/2.0.2/code-generation.html Я буду говорить об этом на днях Scala.

Для возврата идентификатора используйте returning, как в Slick 1. http://slick.typesafe.com/doc/2.0.2/queries.html#inserting

person cvogt    schedule 29.05.2014
comment
Понятно, но как мне вернуть автоматически увеличивающееся значение при вставке? - person Blankman; 29.05.2014
comment
Я понимаю эту часть, я хочу знать гладкий способ 2 возврата первичного ключа/автоматически увеличенного значения из базы данных, когда я вставляю новую строку. - person Blankman; 29.05.2014
comment
returning так же, как в Slick 1. slick.typesafe.com/doc/2.0 .2/queries.html#inserting - person cvogt; 29.05.2014
comment
Спасибо. Раньше я вставлял свою модель с этим очень четким и явным утверждением: users.insert(user) Теперь я вставляю так, чтобы я мог вернуть идентификатор PK autoinc, можете ли вы объяснить это утверждение, чтобы мы знали, что происходит, потому что это кажется очень волшебным для я: val newId = (users returning users.map(_.id) += user Где оператор вставки? Я понимаю, что возврат — это извлечение значения идентификатора базы данных, но я не вижу вызова вставки. Спасибо! - person Blankman; 29.05.2014
comment
также имеет ли смысл возвращать Option[Int] или я должен просто вернуть Int b/c, если вставка не удалась? - person Blankman; 29.05.2014
comment
users - это запрос, представляющий таблицу while в вашем случае. returning преобразует его в вызывающий (Slick вещь), который позволяет вставлять возвращаемые ключи. Мы по-прежнему поддерживаем .insert в Slick 2, но обычно стараемся придерживаться существующего синтаксиса Scala. Синтаксис Scala для вставки чего-либо в изменяемую коллекцию — +=, поэтому мы добавили его в качестве альтернативы вставке. - person cvogt; 29.05.2014
comment
по поводу Варианта... не важно. - person cvogt; 29.05.2014
comment
Я вижу, поэтому, когда вы добавляете в изменяемую коллекцию, она сразу автоматически выполняет вставку. Вот что меня смутило, я привык вызывать вставку, поскольку, похоже, это дает мне контроль над тем, когда вызов действительно будет выполняться. Благодарю. - person Blankman; 29.05.2014
comment
Я не знаю, что вы имеете в виду. += — это просто псевдоним для insert. Такое же поведение. - person cvogt; 30.05.2014