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) <> (Fruit.tupled, Fruit.unapply)
是什么意思?我真的找不到任何关于它的文件。
另外,为什么我们需要一个特质?
【问题讨论】:
【参考方案1】:Table
类有*
方法,它应该实现SELECT * FROM ...
语义。由于 Slick 无法猜测您要如何提取列,因此您必须手动编写(按您想要的顺序使用所有列)。
<>
只是为了让您有一个由*
返回的案例类,而不是一个元组。
这里不需要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 + Play Framework + Slick - Json 作为模型字段
在 slick、scala 中处理 Postgres json 数据类型