我无法弄明白。我现在使用的是:
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-defined" enum_type"?或者如何定义一些将映射到" enum_type"的其他Scala类型?
答案 0 :(得分:5)
我试图让我的postgreSQL枚举与光滑一起工作时有类似的困惑。 Slick-pg允许您将Scala枚举用于您的数据库枚举,测试套件显示how。
以下是一个例子。
假设我们的数据库中包含此枚举类型。
<a class="btn btn-link btn-nav pull-left menu-btn" id="backButton" href="javascript:history.back()">
<span class="icon icon-left-nav"></span>
</a>
我们希望能够将这些映射到Scala枚举,因此我们可以使用Slick愉快地使用它们。我们可以使用slick-pg来做到这一点,它是光滑的扩展。
首先,我们制作上述枚举的Scala版本。
CREATE TYPE Dog AS ENUM ('Poodle', 'Labrador');
为了从slick-pg获得额外的功能,我们扩展了普通的PostgresDriver并说我们想要将我们的Scala枚举映射到PostgreSQL(请记住将application.conf中的光滑驱动程序更改为您创建的那个) )。
object Dogs extends Enumeration {
type Dog = Value
val Poodle, Labrador = Value
}
现在,当您想要创建一个新的模型案例类时,只需使用相应的Scala枚举。
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)
}
}
当你做整个DAO表的恶作剧时,你可以再次使用它。
case class User(favouriteDog: Dog)
显然,无论你在哪里使用它,你都需要Scala Dog枚举。
由于bug in slick,目前您无法动态链接到class Users(tag: Tag) extends Table[User](tag, "User") {
def favouriteDog = column[Dog]("favouriteDog")
def * = (favouriteDog) <> (Dog.tupled, Dog.unapply _)
}
中的自定义光滑驱动程序(它应该可以使用)。这意味着您需要使用start运行play框架而不需要动态重新编译,或者您可以创建一个独立的sbt项目,其中只包含自定义光滑驱动程序并在本地依赖它。