加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 在光滑中使用自动递增模型ID的选项?

发布时间:2020-12-16 08:43:25 所属栏目:安全 来源:网络整理
导读:在许多光滑的例子中,表的类型参数是一个case类,并且表有一个自动递增的主键,我看到在id字段的case类中使用了一个Option: case class Item(id : Option[Long],name : String)object Items extends Table[Item]("item"){ def id = column[Long]("id",O.Primar
在许多光滑的例子中,表的类型参数是一个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的一个更具体的问题.

解决方法

更新:请参阅下面的Rikards评论

你可以在你知道id不是None的地方调用.get.我认为这是人们通常做的事情.

另一种选择是拥有两个不同的类别.一个有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中有一个抽象,但我可能会弄错.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读