描述 Slick 中的可选字段

4

Slick DSL 提供了两种创建表中可选字段的方式。

对于这个 case class:

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 _)
  }
}

这两者有什么区别?是一个是“旧方法”,另一个是“新方法”,还是它们有不同的用途?

我更喜欢第二种选择,其中您将标识定义为ID定义的可选部分,因为这样更加一致。

1个回答

5

第一个操作符.?允许您将字段是否为可选的选择推迟到定义投影时。有时这不是您想要的,但将PK定义为Option可能有点有趣,因为人们可能期望PK为NOT NULL

除了*之外,您还可以在其他投影中使用.?,例如:

def partial = id.? ~ fname

然后,您可以执行Users.partial.insert(None,“Jacobus”),而不必担心您不感兴趣的字段。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接