gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 03:57:52 24 4
gpt4 key购买 nike

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

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 视为数据库定义的“enum_type”?或者如何定义其他一些映射到“enum_type”的 Scala 类型?

最佳答案

当我试图让我的 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 框架而不进行动态重新编译,要么您可以创建一个独立的 sbt 项目,其中仅包含自定义的 slick 驱动程序并在本地依赖它。

关于scala - 如何使用Slick2.0.1映射postgresql自定义枚举列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22945485/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com