播放光滑的更新枚举列

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了播放光滑的更新枚举列相关的知识,希望对你有一定的参考价值。

我无法确定如何使用play-slick更新类型枚举的列。

这是我的枚举和案例类:

object TestStatus extends Enumeration {
  type TestStatus = Value
  val Status1 = Value("Status1")
}
case class Test (
  id: String,
  status: TestStatus
)

和表映射:

class Tests(tag: Tag) extends Table[Test](tag, "tests") {
  implicit val statusColumn = MappedColumnType.base[TestStatus, String](_.toString, TestStatus.withName)
  override def * = (id, status) <> ((Test.apply _).tupled, Test.unapply)
  val id = column[String]("id", 0.PrimaryKey)
  val status = column[TestStatus]("status")
}

当我尝试去更新测试行时,我收到一个错误:

object TestQueries extends TableQuery[Tests](new Tests(_)) {
  def updateStatus(id: String, newStatus: TestStatus) = {
    TestQueries.filter(_.id === id).map(_.status).update(newStatus)
  }
}

[error] Slick does not know how to map the given types.
[error] Possible causes: T in Table[T] does not match your * projection,
[error]  you use an unsupported type in a Query (e.g. scala List),
[error]  or you forgot to import a driver api into scope.
[error]   Required level: slick.lifted.FlatShapeLevel
[error]      Source type: slick.lifted.Rep[models.TestStatus.Value]
[error]    Unpacked type: T
[error]      Packed type: G
[error]     TestQueries.filter(_.id === id).map(_.status).update(newStatus)
[error]                                        ^

IntelliJ显示TestQueries.filter(_.id === id).map(_.status)具有类型Query[Nothing, Nothing, Seq],这使我认为问题在于特定列而不是更新函数。

使用相同的结构更新id工作正常。

答案

您需要定义TestStatus.Value的自定义列类型。这就是如何通过将它映射到已经支持的类型来构建自定义列类型的方式:

implicit def testStatCT: BaseTypedType[TestStatus.Value] = 
  MappedColumnType.base[TestStatus.Value, String](
    enum => enum.toString, str => TestStatus.withName(str)
  )

这种隐式需要在隐式解决方案(如示例中的那个失败)(或者更好地在TestStatus对象中定义以便它始终可用)的任何地方导入,这样光滑的证据可以证明TestStatus.ValueBaseTypedType,这基本上只是意味着什么是支持的列类型。

有关列映射的进一步阅读,请查看Slick Documentation

以上是关于播放光滑的更新枚举列的主要内容,如果未能解决你的问题,请参考以下文章

在knex迁移中更新枚举列类型

具有不同长度片段的简单 mpeg dash 播放列表

光滑的滑块视频复制

使用 PostgreSQL 更新 Laravel 迁移中的枚举列

在 MySQL 5.7 中更新列枚举行号

在数据库中刷新对象之前,将返回光滑的更新操作