*iroi*

mechairoi の Blog

Slick の lifted embedding で FOR UPDATE する

mechairoi/slick-for-update-sample · GitHub

Slcik の lifted embedding で 無理やり FOR UPDATE できようにするサンプル

slick-for-update-sample/Driver.scala at master · mechairoi/slick-for-update-sample · GitHub

みたいに PostgresDriver を継承した MyPostgresDriver を作って,

  import MyPostgresDriver.simple._

  class CoffeesForUpdate(tag: Tag) extends Coffees(tag) with ForUpdateTable
  val coffeesForUpdate = TableQuery[CoffeesForUpdate]
  val q = for {
   c <- coffeesForUpdate if c.price < 9.0
    s <- suppliers if s.id === c.supID
  } yield (c.name, s.name)
  q.list

のように書くと

 select x2."COF_NAME", x3."SUP_NAME" from "COFFEES" x2, "SUPPLIERS" x3 where (x2."PRICE" < 9.0) and (x3."SUP_ID" = x2."SUP_ID") for update of x2

みたいにちゃんとFOR UPDATE するクエリが吐かれる。
FOR UPDATEDBMS によって文法が結構違うのでリポジトリのは PostgreSQL でしか使えない。