Как сопоставить пользовательский столбец enum postgresql с Slick2.0.1?

Я просто не могу понять это. То, что я использую прямо сейчас, это:

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")
}

Проблема в том, что во время вставки/обновления драйвер JDBC для PostgreSQL жалуется на то, что тип параметра является «изменяющимся», когда тип столбца «some_enum», что разумно, поскольку я преобразовываю SomeEnum в String.

Как мне сказать Slick рассматривать String как определенный БД «enum_type»? Или как определить другой тип Scala, который будет отображаться в «enum_type»?


person Marcin    schedule 08.04.2014    source источник
comment
Я не знаю, решит ли это вашу проблему, но видели ли вы slick-pg?   -  person wingedsubmariner    schedule 09.04.2014
comment
К сожалению, в нем не упоминаются перечисления. В любом случае, спасибо. Доберусь до автора этой библиотеки.   -  person Marcin    schedule 09.04.2014
comment
Примечание: в Scala более идиоматично использовать trait SomeEnum с case object A1 и т. д. дочерними элементами вместо Enumeration.   -  person cvogt    schedule 09.04.2014
comment
Кроме того, предоставьте точное сообщение об ошибке, которое вы получаете, и точную строку кода, которая его создает.   -  person cvogt    schedule 09.04.2014
comment
Ссылка: groups.google.com/d/msgid/scalaquery/   -  person cvogt    schedule 09.04.2014


Ответы (1)


У меня была аналогичная путаница, когда я пытался заставить мои перечисления postgreSQL работать с slick. Slick-pg позволяет вам использовать перечисления 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 (не забудьте изменить драйвер slick в application.conf на тот, который вы создали).

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 везде, где вы его используете.

Из-за ошибки в slick в настоящее время вы не можете динамически ссылаться на пользовательский драйвер slick. в application.conf (должно работать). Это означает, что вам нужно либо запустить play framework с запуском, а не выполнять динамическую перекомпиляцию, либо вы можете создать автономный проект sbt только с пользовательским гладким драйвером и зависеть от него локально.

person Iain    schedule 18.06.2015
comment
Можете ли вы включить какой-либо соответствующий контент из ссылки сюда на случай, если ссылка испортится? - person Doug Dawson; 18.06.2015