Slick DSL允许两种方式在表格中创建可选字段。
对于本案例类:
case class User(id: Option[Long] = None, fname: String, lname: String)
您可以通过以下方式之一创建表映射:
object Users extends Table[User]("USERS") {
def id = column[Int]("id", O.PrimaryKey, O.AutoInc)
def fname = column[String]("FNAME")
def lname = column[String]("LNAME")
def * = id.? ~ fname ~ lname <> (User, User.unapply _)
}
和
object Users extends Table[User]("USERS") {
def id = column[Option[Long]]("id", O.PrimaryKey, O.AutoInc)
def fname = column[String]("FNAME")
def lname = column[String]("LNAME")
def * = id ~ fname ~ lname <> (User, User.unapply _)
}
}
两者有什么区别?一个是旧方式,另一个是新方式,还是它们用于不同目的?
我更喜欢第二种选择,你将身份定义为可选的身份定义的一部分,因为它更加一致。
答案 0 :(得分:5)
第一个.?
运算符允许您在定义投影时推迟选择让您的字段为可选字段。有时这不是你想要的,但是将PK定义为Option
可能有点滑稽,因为人们可能期望PK为NOT NULL
。
您可以在.?
之外的其他投影中使用*
,例如:
def partial = id.? ~ fname
然后你可以做Users.partial.insert(None, "Jacobus")
而不用担心你不感兴趣的领域。