2012-11-13 51 views
4

Slick DSL允许两种方式在表格中创建可选字段。在Slick中描述可选字段

对于这种情况类:

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定义的一部分。

回答

5

.?.?第一个操作符允许您推迟在定义投影时选择让您的字段为可选字段。有时候这不是你想要的,但是将你的PK定义为Option也许有点有趣,因为可以预计PK是NOT NULL

可以在追加的突起使用.?除了*,例如:

def partial = id.? ~ fname 

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