在Slick中描述可选字段

Jac*_*ack 4 scala scalaquery slick

Slick DSL允许两种方式在表中创建可选字段.

对于这个案例类:

case class User(id: Option[Long] = None, fname: String, lname: String)
Run Code Online (Sandbox Code Playgroud)

您可以使用以下方法之一创建表映射:

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 _)
  }
Run Code Online (Sandbox Code Playgroud)

  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 _)
  }
}
Run Code Online (Sandbox Code Playgroud)

两者有什么区别?一个是旧方式而另一个是新方式,还是它们用于不同目的?

我更喜欢第二种选择,你将身份定义为可选的身份定义的一部分,因为它更加一致.

eri*_*sei 5

.?在第一个运营商允许你有推迟你的领域是可选的,以确定您的预测时刻的选择.有时这不是你想要的,但是将你的PK定义为一个Option也许有点滑稽,因为人们可能会期待PK NOT NULL.

您可以.?在其他投影中使用*,例如:

def partial = id.? ~ fname
Run Code Online (Sandbox Code Playgroud)

然后你可以做Users.partial.insert(None, "Jacobus")而不用担心你不感兴趣的领域.