我正在尝试这样做(在Play框架上):
db.run(users.filter(_.id === id).map(_.deleted).update(Option(DateTime.now)))
但是它会引发编译错误:
未找到匹配的形状。光滑不知道如何映射给定 类型。可能的原因:表[T]中的T与您的*不匹配 投影,您在查询中使用了不受支持的类型(例如scala列表), 或者您忘记了将驱动程序api导入作用域。所需级别: slick.lifted.FlatShapeLevel 源类型:slick.lifted.Rep [Option [org.joda.time.DateTime]]开箱类型:T 包装类型:G
Slick 3.0.3。的版本。 我该如何解决这个错误?
class UserTable(tag: Tag) extends Table[User](tag, "user") {
def id = column[Int]("id")
def name = column[String]("name")
def age = column[Int]("age")
def deleted = column[Option[DateTime]]("deleted")
override def * =
(id, name, age, deleted) <> ((User.apply _).tupled, User.unapply)
}
case class User(
id: Int = 0,
name: String,
age: Int,
deleted: Option[DateTime] = None
)
答案 0 :(得分:0)
定义表时,<MenuForm />
的作用域中有一个列类型映射器。像
DateTime
例如。该映射器还必须在构造查询的位置的作用域内,否则Slick将不知道如何将您编写的内容转换为SQL查询。
如果要使查询与表分开,则可以导入映射器,也可以在定义implicit val dtMapper = MappedColumnType.base[org.joda.time.DateTime, Long](
dt => dt.getMillis,
l => new DateTime(l, DateTimeZone.UTC)
)
的同一文件中定义查询。一种常见的模式是将表包装为特征,例如UserTable
,然后定义表和该特征中的查询。
See this page,了解有关隐式作用域如何工作的更多信息。