使用光滑插入和更新数据时丢弃值

时间:2014-11-13 14:16:54

标签: scala playframework-2.0 slick

我在play2中使用slick。 我在数据库中有多个由数据库管理的字段。我不想创建或更新它们,但我想在读取值时获取它们。

例如,假设我有

case class MappedDummyTable(id: Int, .. 20 other fields, modified_time: Optional[Timestamp])

在数据库中映射Dummymodified_time由数据库管理。

问题出在insertupdate期间,我在没有修改时间属性的情况下创建MappedDummyTable的实例,并将其传递给光滑以进行创建/更新,如

TableQuery[MappedDummyTable].insert(instanceOfMappedDummyTable)

为此,Slick创建查询为


Insert INTO MappedDummyTable(id,....,modified_time) Values(1,....,null)

并将modified_time更新为NULL,这是我不想要的。我希望Slick在更新和创建时忽略这些字段。

为了更新,我可以

TableQuery[MappedDummyTable].map(fieldsToBeUpdated).update(values)

但这导致map方法中的20个奇数字段看起来很难看。

还有更好的方法吗?

更新

我发现的最佳解决方案是使用多个投影。我创建了一个用于获取值的投影,另一个用于更新和插入数据

2 个答案:

答案 0 :(得分:0)

如果您不想编写像row => (row.id,...other 20 fields)

这样的代码,可能需要在表格中编写一些触发器

或尝试使用None代替null

答案 1 :(得分:0)

我相信具有映射非默认字段的解决方案是使用Slick执行此操作的唯一方法。为了减少丑陋,你可以在MappedDummyTable上定义函数ignoreDefaults,它只返回伴随对象中的非默认值和函数给返回投影的MappedDummyTable案例类

TableQuery[MappedDummyTable].map(MappedDummyTable.ignoreDefaults).insert(instanceOfMappedDummyTable.ignoreDefaults)