LoginSignup
4
3

More than 5 years have passed since last update.

Scala コードの列挙型と DB(Slick)の整数型 / 文字列型をマッピングする

Last updated at Posted at 2015-12-20

デフォルトでマッピングできるのはプリミティブ型のみです。Enum を含め、それ以外の独自定義型をマッピングする場合は MappedColumnType を使い、マッピングの関数定義が必要です。詳細は公式ドキュメントの「USER-DEFINED FEATURES」を参照してください。

注)手元の環境は以下です。
* Scala 2.11.6
* Slick 3.1.0

列挙型 の定義

マッピング対象の列挙型として以下があるとします。

// 文字列型 にマッピングするEnum
object Color extends Enumeration {
  type Color = Value
  val Blue = Value("Blue")
  val Red = Value("Red")
  val Green = Value("Green")
}

// 整数型にマッピングするEnum
object Bar extends Enumeration {
  type Bar = Value
  val b1 = Value
  val b2 = Value
  val b3 = Value
}

Slick でのテーブル定義

column定義の箇所で、普通に独自定義の Enumeration が使えます。MappedColumnType を使い、implicit なマッピング関数を定義している点に注意してください。こういうマッピングを独自定義型に対して書く必要があります。

class SampleTable(tag: Tag) extends Table[Sample](tag, "Sample") {
  def name  = column[String]("NAME")
  def id    = column[Int]("ID")
  def color = column[Color]("COLOR")
  def bar   = column[Bar]("BAR")
  def * = (name, id, color, bar) <> (Sample.tupled, Sample.unapply)
}
implicit val colorMapper = MappedColumnType.base[Color, String](
  e => e.toString,
  s => Color.withName(s)
)
implicit val barMapper = MappedColumnType.base[Bar, Int](
  e => e.id,
  i => Bar.apply(i)
)
4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3