Автоинкрементное поле Scala Slick

Это вопрос, аналогичный другим вопросам об автоинкременте, но вместо предоставления списка столбцов для определения autoInc мне нужно каким-то образом предоставить ссылку на таблицу. Я использую MySQL

import scala.slick.driver.MySQLDriver.simple._
import play.Logger
import slick.session.Database.threadLocalSession

object PaypalCartItems extends Table[PaypalCartItem]("paypalCartItem") {
  def id          = column[Int]("id", O.PrimaryKey, O.AutoInc)
  def itemName    = column[String]("item_name")
  def sku         = column[String]("item_number")
  def quantity    = column[String]("quantity")
  def txnId       = column[String]("txn_id")
  def url         = column[String]("url")

  def * = itemName ~ sku ~ quantity ~ txnId ~ url ~ id <> (PaypalCartItem, PaypalCartItem.unapply _)

  // I don't want to list out the columns, I need to reference the table
  def autoInc = itemName ~ sku ~ quantity ~ txnId ~ url returning id

  def insertItems(items: List[PaypalCartItem]): List[PaypalCartItem] = items map { item: PaypalCartItem =>
    val newId = PaypalCartItems.autoInc.insert(item)
    item.copy(id=newId)
  }
}

Приведенный выше код не компилируется, выдавая следующее:

[error]   overloaded method value insert with alternatives:
[error]   [TT](query: scala.slick.lifted.Query[TT,(String, String, String, String, String)])(implicit session: scala.slick.session.Session)Seq[Int] <and>
[error]   (value: (String, String, String, String, String))(implicit session: scala.slick.session.Session)Int
[error]  cannot be applied to (PaypalCartItem)
[error]     val newId = PaypalCartItems.autoInc.insert(item)

person Mike Slinn    schedule 03.01.2013    source источник
comment
Не уверен, что вы имели в виду, мне нужно как-то предоставить ссылку на таблицу.   -  person pedrofurla    schedule 03.01.2013


Ответы (1)


Не уверен, что это поможет вам, но я делаю так:

def autoInc2 = * returning id.? into {
      case (Music(_, title, artist, album, isrc, ownerId), id) => Music(id, title, artist, album, isrc, ownerId)
    }

Где первым аргументом для Music является идентификатор, в данном случае Option[Int]. И он используется как val musicWithId = Musics.autoInc2.insert(someMusicObjectWithId)

person pedrofurla    schedule 03.01.2013
comment
Этот подход работает, но он ненадежен и многословен. Каждое свойство класса case должно быть пронумеровано дважды. Лучше, если вместо этого можно было бы использовать конструктор копирования класса case с именованным параметром или, возможно, преобразовать свойства класса case в кортеж, используя unapply(music).get, а затем снова с другим значением для id. Хотя, похоже, много суеты - person Mike Slinn; 03.01.2013