在浮油中使用自动递增模型ID的选项?

时间:2013-11-30 03:52:58

标签: scala slick

在许多光滑的例子中,表的类型参数是一个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的一个更具体的问题。

1 个答案:

答案 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中对此有一个抽象,但我可能会弄错。