在许多光滑的例子中,表的类型参数是一个case类,而且表有一个自动递增的主键,我看到在id字段的case类中使用了一个Option:
case class Item(id : Option[Long], name : String)
object Items extends Table[Item]("item"){
def id = column[Long]("id", O.PrimaryKey, O.AutoInc)
def name = column[String]("name")
def * = id.? ~ name <> (Item.apply _, Item.unapply _)
}
这种方式对我来说很有意义,因为在将对象插入表中之前,id字段没有任何有意义的值。但是,数据库查询将总是返回给我的id设置为某个东西的项目,并且它总是非常繁琐,总是折叠或模式匹配我知道不会是什么。当我创建一个新项目时,我可以在id字段中添加一个0L,但这似乎不是一个好的选择。
这通常如何处理?那是唯一的两种选择吗?
这个related question有一些可能的答案。问题本身就是关于postgres的一个更具体的问题。
答案 0 :(得分:1)
更新 :请参阅下面的Rikards评论
您可以在知道ID不是.get
的地方拨打None
。我想人们通常会这样做。
另一种选择是拥有两个不同的类。一个有id字段而一个没有。或者ID特征,您只混合具有ID的类。
trait WithID{ def id : Int }
case class Person(name: String)
// create a person with id
(newid:Int,name:String) => new Person(name) with WithID{ def id = newid }
您必须为Slick提供的映射将更加详细,但使用代码将更简单且类型安全。我相信@nafg在https://github.com/nafg/slick-additions中对此有一个抽象,但我可能会弄错。