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),
// ...
)
Более подробную информацию можно найти в этом скользком документе.