読者です 読者をやめる 読者になる 読者になる

Kuchitama Tech Note

はてな記法がいつまでたっても覚えられないので、はてなダイアリーからマークダウンが使えるこっちに引っ越してきました。

slick3 で sql in を書く

scala slick

最近仕事でSlick3を使ってますが、 SELECT * FROM hoge WHERE hoge.id IN (1, 2, 3) 的な書き方が最初わからなかったのでメモ。

SQLパターン

SQLではどうやらListを扱ってないらしい。 というのを、 id:tarao さんのこの記事で知りました。

d.hatena.ne.jp

へぇ、そうだったのか。 taraoさんには、Scala関西Summitで発表していただいたし、 bullet-scala 面白そうなので、今のプレジェクトに突っ込むかもしれないと思いつつ、勉強させて頂いてますが、 IN のことは知りませんでした。

github.com

liftedな書き方パターン

Scalaらしいモナモナした(?)書き方でやるとき。 今のプロジェクトではこっちでやってます。

こういうやつ↓

db.run {
  hoges.filter(id = 1).result
}

これで、SQLIN を使うには、2通りあるらしい。

一つは、SQLのサブクエリを評価するとき。これには in を使う

db.run {
  hoges.filter(id.in(fugas.map(_.hogeId))).result
}

もうひとつ、 Scalaのコレクションを利用するとき。これには、 inSet という関数が用意されてる。

val hogeIds = List(1,2,3)
db.run {
  hoges.filter(id.inSet(hogeIds)).result
}

これ、公式ドキュメントに普通に載ってるんですが、Querysのページばっかり読んでて、見つけるまで時間がかかってしまいました。

http://slick.typesafe.com/doc/3.0.3/sql-to-slick.html