在不使用普通sql的情况下增加列

时间:2014-06-05 21:38:00

标签: scala playframework slick

我正在使用以下内容在我的数据库中递增列(不是自动增量PK列):

def incrementLikeCount(thingId: Int)(implicit session: Session) = {
  sqlu"update things set like_count = like_count + 1 where id = $thingId".first
}

这是目前(光滑的2.0.2)最好和最快的方式吗? (我使用postgresql)

我希望有更多类型安全的做法,例如:如果我重命名我的表或列,我想编译时错误。

我不想在行中读取然后更新,因为在读取和写入操作期间我必须在事务中包装调用,这不如我想要的那样高效。

我很乐意,如果有一种方法可以使用普通的光滑api来做到这一点,并且能够在一次操作中同时更新/递增多个计数器(但是一次甚至一列增量/减量)很可爱)

1 个答案:

答案 0 :(得分:0)

不是Slick,在这里可爱的ScalaQuery石头中,你应该能够使用所谓的MutatingUnitInvoker来修改DB行(即执行单个查询)。

类似的东西:

val q = for{id <- Parameters[Int]; t <- Things if t.id is id} yield t
def incrementLikeCount(thingId: Int)(implicit session: Session) = {
  q(thingId).mutate(r=> r.row.copy(like_count = r.row.like_count + 1))
}

性能应该是可接受的,在编译时生成一次预处理语句,并对数据库进行单个查询。不知道如何以类型安全的方式改进Slick当前所提供的功能。