Scala Slick模式特征中的“覆盖def *”是啥

Posted

技术标签:

【中文标题】Scala Slick模式特征中的“覆盖def *”是啥【英文标题】:What is 'override def *' in Scala Slick schema traitScala Slick模式特征中的“覆盖def *”是什么 【发布时间】:2021-12-18 12:21:13 【问题描述】:
case class Fruit(
                     apple: String,
                     banana: String
                   )


trait AppleComponent  self: HasDatabaseConfig[JdbcProfile] =>
  import profile.api._

  class Fruits(tag: Tag) extends Table[Fruit](tag, "fruits") 
    def apple      = column[String]("apple")
    def banana     = column[String]("banana")
    // what is this line of code used for?
    override def *    = (apple,banana) <> (Fruit.tupled, Fruit.unapply)
    def applePK = primaryKey("apple", apple)
  

  protected lazy val Apples = TableQuery[Fruits]


我是Scala Slick 的新手,所以我想知道override def * = (apple,banana) &lt;&gt; (Fruit.tupled, Fruit.unapply) 是什么意思?我真的找不到任何关于它的文件。 另外,为什么我们需要一个特质?

【问题讨论】:

【参考方案1】:

Table 类有* 方法,它应该实现SELECT * FROM ... 语义。由于 Slick 无法猜测您要如何提取列,因此您必须手动编写(按您想要的顺序使用所有列)。

&lt;&gt; 只是为了让您有一个由* 返回的案例类,而不是一个元组。

这里不需要trait。这个:

// module name
trait AppleComponent 
  // self-type for dependency injection
  self: HasDatabaseConfig[JdbcProfile] =>

  // dependencies injected by mixing-in this trait:

  protected lazy val Apples = TableQuery[Fruits]

被称为蛋糕图案。一般来说,它是一种反模式(但 ZIO 最近推出了一种特定的使用方式)。

我会说您使用的任何文档或教程都已经过时了几年。

【讨论】:

以上是关于Scala Slick模式特征中的“覆盖def *”是啥的主要内容,如果未能解决你的问题,请参考以下文章

Scala - 特征中的模板方法模式

Scala 用于理解 Slick Query

Scala + Play Framework + Slick - Json 作为模型字段

在 slick、scala 中处理 Postgres json 数据类型

为不存在的表 slick scala (Slick 3.0.0, scala) 创建一个类 Table

如何在 Scala Slick 中运行补丁/部分数据库更新?