当我试图让我的 postgreSQL 枚举与 slick 一起工作时,我也遇到了类似的困惑。Slick-pg https://github.com/tminglei/slick-pg允许您将 Scala 枚举与数据库枚举一起使用,测试套件显示how https://github.com/tminglei/slick-pg/blob/master/src/test/scala/com/github/tminglei/slickpg/PgEnumSupportSuite.scala.
下面是一个例子。
假设我们的数据库中有这个枚举类型。
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 枚举,您都需要在范围内使用它。
由于一个光滑的错误 https://github.com/slick/slick/pull/1152,目前您无法动态链接到自定义光滑驱动程序application.conf
(它应该有效)。这意味着您要么需要通过 start 运行 play 框架而不进行动态重新编译,要么您可以创建一个独立的 sbt 项目,其中仅包含自定义的 slick 驱动程序并在本地依赖它。