Использование перечисления Postgres с Quill

Я пытаюсь использовать перечисление Scala 2 с Quill, например:

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'

Как правильно обрабатывать перечисления с помощью Quill в Scala 2.13?

Редактировать

Я экспериментировал, в том числе с использованием библиотеки Enumeratum, и значения перечисления все еще не генерируются правильно.

Используя отладчик, я вижу, что пользовательский кодировщик оценивается, но результирующее значение никогда не попадает в сгенерированный запрос.

Я разместил пример проблемы здесь:
https://gist.github.com/daharon/97e8b167911723054ac3845fc35c0b11

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
89
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Попробуйте добавить цитаты

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

Попробовав ваше предложение, похоже, выяснилось, что Quill вообще не находит мой пользовательский кодировщик/декодер. Я не знаю, куда поместить эти значения implicit сейчас.

daharon 18.04.2023 03:49

@daharon Да, ты должен import MyEnumType._. object MyEnumType не является сопутствующим объектом, потому что type MyEnumType — это тип, а не класс. Итак, object MyEnumType не находится в неявной области.

Dmytro Mitin 18.04.2023 03:52

@daharon Помогает ли импорт MyEnumType._? Если да, то работает ли он с вашими оригинальными кодеками или с моими кодеками с кавычками?

Dmytro Mitin 18.04.2023 10:49

Я был неправ. Нет необходимости импортировать MyEnumType._. Имплициты можно увидеть, хотя object MyEnumType не является компаньоном. scastie.scala-lang.org/DmytroMitin/Z9CSo2UbSmKraNX8du5yZw/1 Это потому, что MyEnumType.MyEnumType есть MyEnumType.type#MyEnumType. «Части типа T: ... если T является проекцией типа S#U, части S, а также самого T;» scala-lang.org/files/archive/spec/2.13/…

Dmytro Mitin 24.04.2023 05:05
Ответ принят как подходящий

Проблема заключалась в том, что по умолчанию значение перечисления генерировалось 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))
}

Другие вопросы по теме