【问题标题】:How to map postgresql custom enum column with Slick2.0.1?如何使用 Slick2.0.1 映射 postgresql 自定义枚举列?
【发布时间】:2015-06-19 04:25:02
【问题描述】:

我就是想不通。我现在使用的是:

abstract class DBEnumString extends Enumeration {
  implicit val enumMapper = MappedJdbcType.base[Value, String](
     _.toString(),
     s => this.withName(s)
  )
}

然后:

object SomeEnum extends DBEnumString {
  type T = Value
  val A1 = Value("A1")
  val A2 = Value("A2")
}

问题是,在插入/更新 PostgreSQL 的 JDBC 驱动程序期间,当列类型为“some_enum”时,参数类型为“字符变化”,这是合理的,因为我将 SomeEnum 转换为 String。

如何告诉 Slick 将 String 视为 DB 定义的“enum_type”?或者如何定义映射到“enum_type”的其他 Scala 类型?

【问题讨论】:

  • 我不知道这是否能解决你的问题,但你见过slick-pg吗?
  • 不幸的是,它没有提到枚举。总之感谢。我会联系这个图书馆的作者。
  • 旁注:在 Scala 中使用 trait SomeEnumcase object A1 等子代而不是枚举更为惯用。
  • 另外,请提供您收到的确切错误消息以及产生它的确切代码行。

标签: scala enums postgresql-9.2 slick-2.0


【解决方案1】:

在尝试让我的 postgreSQL 枚举与 slick 一起使用时,我也有类似的困惑。 Slick-pg 允许您将 Scala 枚举与数据库枚举一起使用,测试套件显示 how

下面是一个例子。

假设我们的数据库中有这个枚举类型。

CREATE TYPE Dog AS ENUM ('Poodle', 'Labrador');

我们希望能够将这些映射到 Scala 枚举,这样我们就可以在 Slick 中愉快地使用它们。我们可以使用 slick-pg,一个 slick 的扩展来做到这一点。

首先,我们制作上述枚举的 Scala 版本。

object Dogs extends Enumeration {
  type Dog = Value
  val Poodle, Labrador = Value
}

为了从 slick-pg 获得额外的功能,我们扩展了普通的 PostgresDriver 并说我们想将我们的 Scala 枚举映射到 PostgreSQL 的枚举(记住将 application.conf 中的 slick 驱动程序更改为您创建的驱动程序)。

object MyPostgresDriver extends PostgresDriver with PgEnumSupport {
  override val api = new API with MyEnumImplicits {}

  trait MyEnumImplicits {
    implicit val dogTypeMapper = createEnumJdbcType("Dog", Dogs)
    implicit val dogListTypeMapper = createEnumListJdbcType("Dog", Dogs)

    implicit val dogColumnExtensionMethodsBuilder = createEnumColumnExtensionMethodsBuilder(Dogs)
    implicit val dogOptionColumnExtensionMethodsBuilder = createEnumOptionColumnExtensionMethodsBuilder(Dogs)
  }
}

现在当你想创建一个新的模型案例类时,只需使用相应的 Scala 枚举即可。

case class User(favouriteDog: Dog) 

当你做整个 DAO 表的恶作剧时,你可以再次使用它。

class Users(tag: Tag) extends Table[User](tag, "User") {
  def favouriteDog = column[Dog]("favouriteDog")
  def * = (favouriteDog) <> (Dog.tupled, Dog.unapply _)
}

显然,无论您在何处使用,都需要在范围内使用 Scala Dog 枚举。

由于bug in slick,目前您无法动态链接到application.conf 中的自定义光滑驱动程序(它应该可以工作)。这意味着您要么需要使用 start 运行 play framework 而无需动态重新编译,要么您可以创建一个独立的 sbt 项目,其中仅包含自定义的 slick 驱动程序并在本地依赖它。

【讨论】:

  • 您能否在此处包含链接中的任何相关内容,以防链接失效?
猜你喜欢
  • 2013-01-30
  • 2018-04-11
  • 2022-12-14
  • 2023-03-20
  • 1970-01-01
  • 2015-11-15
  • 1970-01-01
  • 1970-01-01
  • 2016-09-08
相关资源
最近更新 更多