gpt4 book ai didi

scala - 在 slick 中使用自动递增模型 ID 的选项?

转载 作者:行者123 更新时间:2023-12-02 08:56:20 25 4
gpt4 key购买 nike

在许多巧妙的示例中,其中表的类型参数是案例类,并且表具有自动递增主键,我已经看到案例类中的 id 字段使用了 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 设置为某物的项目,并且总是在我知道不会是 None 的东西上折叠或模式匹配变得非常乏味。当我创建一个新项目时,我可以在 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 中对此有一个抽象。但我可能错了。

关于scala - 在 slick 中使用自动递增模型 ID 的选项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20296308/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com