加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 如何使用Slick2.0.1映射postgresql自定义枚举列?

发布时间:2020-12-16 10:04:37 所属栏目:安全 来源:网络整理
导读:我只是想不出来.我现在使用的是: abstract class DBEnumString extends Enumeration { implicit val enumMapper = MappedJdbcType.base[Value,String]( _.toString(),s = this.withName(s) )} 然后: object SomeEnum extends DBEnumString { type T = Valu
我只是想不出来.我现在使用的是:

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类型?

解决方法

当我试图让我的postgreSQL枚举与光滑一起工作时,我有类似的困惑. Slick-pg允许您将Scala枚举用于您的数据库枚举,测试套件显示 how.

以下是一个例子.

假设我们在数据库中有这个枚举类型.

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

我们希望能够将这些映射到Scala枚举,因此我们可以使用Slick愉快地使用它们.我们可以使用slick-pg来做到这一点,它是光滑的扩展.

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

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

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

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框架而不是动态重新编译,或者您可以创建一个独立的sbt项目,其中只包含自定义光滑驱动程序并在本地依赖它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读