【问题标题】:Updating table with enum使用枚举更新表
【发布时间】:2018-12-10 19:23:32
【问题描述】:

尝试将信息插入到如下所示的数据库中:

(UUID, EnumType)

具有以下逻辑:

var t = TestTable.query.map(t=> (t.id, t.enumType)) ++= toAdd.map(idTest, enumTest)))

但是编译器为TestTable.query.map(t=> (t.id, t.enumType)) 抛出一个错误,它将其解释为Iteratable[Nothing] 类型,我错过了什么吗?


测试表如下所示:

object TestTable {
  val query = TableQuery[TestTable]
}

class TestTable(tag: slick.lifted.Tag) extends Table[TestTable](tag, "test_table") {
  val id = column[UUID]("id")
  val enumType = column[EnumType]("enumType")

  override val * = (id, testType) <> (
    (TestTable.apply _).tupled,
    TestTable.unapply
  )

【问题讨论】:

  • 能分享一下EnumType的定义吗?

标签: scala slick sangria


【解决方案1】:

假设你有以下数据结构:

object Color extends Enumeration {
  val Blue = Value("Blue")
  val Red = Value("Red")
  val Green = Value("Green")
}

case class MyType(id: UUID, color: Color.Value)

定义 slick schema 如下:

class TestTable(tag: slick.lifted.Tag) extends Table[MyType](tag, "test_table") {
  val id = column[UUID]("id")
  val color = column[Color.Value]("color")

  override val * = (id, color) <> ((MyType.apply _).tupled, MyType.unapply)
}

object TestTable {
  lazy val query = TableQuery[TestTable]
}

要将枚举映射到 SQL 数据类型 slick 需要隐式 MappedColumnType

implicit val colorTypeColumnMapper: JdbcType[Color.Value] = MappedColumnType.base[Color.Value, String](
  e => e.toString,
  s => Color.withName(s)
)

现在您可以通过这种方式将值插入 DB:

val singleInsertAction = TestTable.query += MyType(UUID.randomUUID(), Color.Blue)

val batchInsertAction = TestTable.query ++= Seq(
  MyType(UUID.randomUUID(), Color.Blue),
  MyType(UUID.randomUUID(), Color.Red),
  MyType(UUID.randomUUID(), Color.Green)
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多