我尝试了解一些Slick的作品以及它需要什么.
这是一个例子:
package models
case class Bar(id: Option[Int] = None, name: String)
object Bars extends Table[Bar]("bar") {
def id = column[Int]("id", O.PrimaryKey, O.AutoInc)
// This is the primary key column
def name = column[String]("name")
// Every table needs a * projection with the same type as the table's type parameter
def * = id.? ~ name <>(Bar, Bar.unapply _)
}
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下*这里方法的目的是什么<>,为什么unapply?什么是Projection - 方法~'返回实例Projection2?
我目前正在编写Slick代码来定位具有两个表> 22列的旧模式.如何使用新的HList代码?在Scala 2.10.3下,我在其他方面有2.0-M3正常工作.这是我目前使用的案例类/元组的语法.如何使用文档中提到的新HList?
case class Joiner(
id: Int,
name: Option[String],
contact: Option[String]
)
class Joiners(tag: Tag) extends Table[Joiner](tag, "joiner") {
def id = column[Int]("id", O.PrimaryKey, O.AutoInc, O.DBType("int(11)"))
def name = column[Option[String]]("name", O.DBType("varchar(255)"))
def contact = column[Option[String]]("contact", O.DBType("text"))
def * = (id, name.?, contact.?) <> (Joiner.tupled, Joiner.unapply)
}
val joiners = TableQuery[Joiners]
Run Code Online (Sandbox Code Playgroud)
我在示例中没有看到任何内容,只是在最新更新的文档中提及了一下.我是Scala和Slick的新手.
我正在尝试将超过22列的数据库行映射到案例类树.我宁愿不使用HList,因为我不想使用该API,还有一些我在某处读过的指数编译时间反馈......
我已经读过Stefan Zeiger回答的这个帖子:如何使用嵌套元组或HLists处理带有Slick的> 22列表?
我已经看过这个测试,它展示了如何定义自定义映射函数,我想这样做:
def * = (
id,
(p1i1, p1i2, p1i3, p1i4, p1i5, p1i6),
(p2i1, p2i2, p2i3, p2i4, p2i5, p2i6),
(p3i1, p3i2, p3i3, p3i4, p3i5, p3i6),
(p4i1, p4i2, p4i3, p4i4, p4i5, p4i6)
).shaped <> ({ case (id, p1, p2, p3, p4) =>
// We could do this without .shaped but then we'd have to write a type annotation for the parameters
Whole(id, Part.tupled.apply(p1), Part.tupled.apply(p2), Part.tupled.apply(p3), Part.tupled.apply(p4))
}, { w: Whole =>
def f(p: Part) = Part.unapply(p).get …Run Code Online (Sandbox Code Playgroud) 如果要在Scalding中创建一个包含超过22个字段的管道,则受Scala元组的限制,Scala元组的数量不能超过22个.
有没有办法使用集合而不是元组?我想象下面的例子,遗憾的是它不起作用:
input.read.mapTo('line -> aLotOfFields) { line: String =>
(1 to 24).map(_.toString)
}.write(output)
Run Code Online (Sandbox Code Playgroud)