Slick - вставка строки с использованием объекта вместо кортежа

Я опытный Java-разработчик, который пытается изучать Scala и Slick одновременно. Все примеры, которые я нашел для вставки строк в таблицу с помощью Slick, создают кортеж с использованием позиционных аргументов. Например, я возьму из официальной документации Lightbend:

val insertActions = DBIO.seq(
  coffees += ("Colombian", 101, 7.99, 0, 0),

  coffees ++= Seq(
    ("French_Roast", 49, 8.99, 0, 0),
    ("Espresso",    150, 9.99, 0, 0)
  ),

  // "sales" and "total" will use the default value 0:
  coffees.map(c => (c.name, c.supID, c.price)) += ("Colombian_Decaf", 101, 8.99)
)

Но полагаться на позиционные аргументы - ошибка, ожидающая своего появления, и ее также трудно прочитать. Есть ли более удобный для читателей и менее подверженный ошибкам способ сделать это? Как с кофейным объектом?

Я представляю что-то вроде этого:

val insertActions = DBIO.seq(
    coffees += new Coffee(name="Colombian", id=101, price=7.99, foo=0, bar=0)

    coffees ++= Seq(
        new Coffee (name= "French_Roast", id=49, price=8.99, foo=0, bar=0),
        new Coffee (name = "Espresso",    id = 150, price=9.99, foo=0, bar=0)
    )
)

Извините, если мой код выглядит как Java, вот откуда я. Но вы поняли, чего я хочу. Есть ли способы сделать это?

1 ответ

Одним из подходов будет определение класса случая, скажем, Coffee с теми же полями, что и класс строки таблицы Coffees"S. Подвох в том, что вам нужно изменить класс Coffees расширить Table[Coffee] и обеспечить двунаправленное отображение, используя <> для * проекция:

case class Coffee(name, supID, price)

class Coffees(tag: Tag) extends Table[Coffee](tag, "USERS") {
  // ...
  def * = (name, supID, price) <> (Coffee.tupled, Coffee.unapply)
}

Вы должны быть в состоянии выполнить insert лайк:

val insertActions = DBIO.seq(
  coffees += Coffee(name = "Colombian", supID = 101, price = 7.99),
  // ...
)

Более подробную информацию можно найти в этом скользком документе.

Другие вопросы по тегам