2014年01月13日

Slickをちょこちょこ使う

最近、Slickをちょこちょこ使っている。Typesafeのお墨付きもあるし、ScalaからDBを使おうと考えると、これを選択するのが一般的になるのだろう。

今週末はどの記述がどういうクエリを投げているのか確かめたりしてみた。

ScalaのORM「Slick」でいろんなSQLを投げてみる
http://www.mwsoft.jp/programming/scala/slick_query.html



最初はけっこう戸惑うことが多かった。Playもそうだけど、記号が頻出する書き方が多くて、それがなんなのか知っていないとうまく使えない、メソッド名だけで想像して適当に使えばなんとかなるというものではない。

また、これもPlayと共通するところだけど、公式のドキュメントにいるサンプルは、何がimportされていて、何がimplicitで渡っているのかわかりづらいところがあって、たとえば使い始めた時はSessionがどこで渡っているのかを認識できておらず、エラーが出た時に困惑した。

APIを見ながらどこで何が渡っているのかを確認して、何度かコンパイルエラーになりながら、ようやく使いこなせるようになった。



Scalaユーザはプログラミング上級者が多くて、私のようなそこまで至っていない人間だと、何かと難儀することが多い。

PlayやSlickを学習していると、初心者向けの記述と、中級者以上向けの記述、双方が用意されていると、よりわかりやすいのではないかとよく思う。

たとえば、こんな感じからスタートするとか。


Database.forURL("jdbc:h2:mem:test1", driver = "org.h2.Driver") withSession { session: Session =>
// 一覧を取る
val list = Query(Coffees).list()(session)

// 最初のレコードを取る(要素がなかったら例外)
val first = Query(Coffees).first()(session)

// 最初のレコードをOption型で取る(要素がないとNone)
val firstOpt = Query(Coffees).firstOption()(session)

// 取得レコードをループする
Query(Coffees).foreach(coffee => {
// do something
})(session)
}


で、この辺りを動かしてから、次に implicitでSessionを渡すところを省略しましょう、と。さらに、threadLocalSessionを登場させて比較しながら話を進めてみたり。

この辺りのJavaプログラマに優しそうな解説はPlayでもSlickでも一度やってみたいと思いつつ、そんな時間はいつ取れば良いのやら。