首页 > 解决方案 > 如何在 Slick 中将案例类映射为 postgresql 列

问题描述

我有以下数据结构:

final case class Log(
  id: UUID,
  event: String,
  metadata: Option[List[Metadata]]
)

final case class Metadata(key: String, value: String)

用于带有一些可选元数据的事件日志。我正在尝试使用 Slick (v3.3.3) 和 Slick-pg (v0.17.3) 将它们保存在 postgresql (v42.2.5) 表中:

class LogTable(tag: Tag)
    extends BaseTable[Log](tag, "event") {

  def id: Rep[EventId]                      = column[EventId]("id")
  def event: Rep[String]                    = column[String]("event")
  def metadata: Rep[Option[List[Metadata]]] = column[Option[List[Metadata]]]("metadata")

  override def * =
    (id, event, eventType, metadata) <>
      ((Log.apply _).tupled, Log.unapply _)
}

但是我得到以下编译错误:

could not find implicit value for parameter tt: slick.ast.TypedType[Option[List[log.domain.Metadata]]]

我尝试编写自定义列映射器:

  implicit val metadataColumnType = MappedColumnType.base[Metadata, String](
    {
      meta => write(meta) // return string
    }, {
      meta_string => read(meta_string) // return Metadata
    }
  )

然而,这种隐式并不被认为是必要的,并且会导致相同的错误。

如何Option[List[Metadata]正确映射?

标签: postgresqlscalaslickmapper

解决方案


推荐阅读