光滑-使用对象而不是元组插入行

时间:2018-07-23 17:47:49

标签: scala orm slick

我是一位经验丰富的Java开发人员,他试图同时学习Scala和Slick。我发现的使用Slick在表中插入行的所有示例似乎都使用 positional 参数构造了一个元组。例如,我将从official lightbend documentation中提取:

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 个答案:

答案 0 :(得分:1)

一种方法是定义一个案例类,例如Coffee,其字段与表行类Coffees的字段相同。要注意的是,您需要修改类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),
  // ...
)

更多详细信息,请参见此Slick doc