postgresql 在Quill中使用Postgres枚举

pdtvr36n  于 2023-04-20  发布在  PostgreSQL
关注(0)|答案(2)|浏览(141)

我尝试在Quill中使用Scala 2枚举,如下所示:

import io.getquill.MappedEncoding

object MyEnumType extends Enumeration {
  type MyEnumType = Value

  val ONE, TWO, THREE = Value

  implicit val encode: MappedEncoding[MyEnumType, String] =
    MappedEncoding(_.toString)
  implicit val decode: MappedEncoding[String, MyEnumType] =
    MappedEncoding(MyEnumType.withName)
}

但是我在Postgres中遇到了一个错误:

ERROR: operator does not exist: my_enum_type = character varying
  Hint: No operator matches the given name and argument types. You might need to add explicit type casts.

我使用translate打印出查询,查询是这样生成的:

WHERE column_1 = ONE

在这里,我 * 期望 * 它被渲染为:

WHERE column_1 = 'ONE'

在Scala 2.13中使用Quill处理枚举的正确方法是什么?

编辑

我一直在做实验,包括使用Enumeratum库,枚举值仍然不能正确生成。
使用调试器,我可以看到自定义编码器正在被评估,但结果值从未进入生成的查询。
我在这里发布了一个问题的例子:
https://gist.github.com/daharon/97e8b167911723054ac3845fc35c0b11

wljmcqd8

wljmcqd81#

尝试添加引号

implicit val encode: MappedEncoding[MyEnumType, String] =
  MappedEncoding(x => s"'$x'")
implicit val decode: MappedEncoding[String, MyEnumType] =
  MappedEncoding(s => MyEnumType.withName(s.stripPrefix("'").stripSuffix("'")))
uujelgoq

uujelgoq2#

问题是,默认情况下,Quill生成的枚举值是java.sql.Types.VARCHAR。因此出现了错误operator does not exist: my_enum_type = character varying,因为Postgres不知道如何将character varying转换为我自定义的Postgres enum类型。
解决方案是强制Quill将值编码为java.sql.Types.OTHER

object Ctx extends PostgresJdbcContext(SnakeCase)

object MyEnumType extends Enumeration {
  type MyEnumType = Value

  val ONE, TWO, THREE = Value

  import Ctx.*
  
  implicit val enc: Encoder[MyEnumType] = encoder(
    java.sql.Types.OTHER,
    (index, value, row) => row.setObject(index, value.toString, java.sql.Types.OTHER)
  )

  implicit val dec: Decoder[MyEnumType] =
    decoder(row => index => this.withName(row.getObject(index).toString))
}

相关问题