我是一位经验丰富的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,那正是我的来历。但是你知道我想要什么。有什么办法吗?
答案 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。