【问题标题】: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) 是什么意思?我真的找不到任何关于它的文件。 另外,为什么我们需要一个特质?

【问题讨论】:

    标签: scala slick


    【解决方案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 最近推出了一种特定的使用方式)。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-01
      • 1970-01-01
      • 2011-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多