GitHubのスター数で見るScalaのDBアクセスライブラリ

吉田さんがこういう記事を書いていたので真似してデータベースアクセスライブラリ版を書いてみました。

xuwei-k.hatenablog.com

2009年からのグラフですが、トップ5のスター数の推移はこんな感じ。

f:id:takezoe:20171119132632p:plain

slick/slick ★1930

github.com

相変わらずの一番人気。この1年では300くらいスターが増えている。DBIOで強制モナモナやjoinしたつもりなのに何故かサブクエリになるSQLなど問題が多いのに何故こんなに人気があるのか考えさせられるものがある。クエリビルダは非常に柔軟かつ強力だけど、やはり出てくるSQLが想像もつかないのは厳しい。joinを多用するアプリケーションでは(MySQLの場合は特に)使わないほうがよいと思うし、シンプルなCRUDしかしないんだったらこんなに複雑なクエリビルダ要らないのではという気がする。

また、最近はそうでもないけどSQLだけでなく汎用的なクエリビルダを目指しておりSQL固有の機能を頑なに取り入れない方針だったのも実用性を考えるとどうなのかと思わざるを得ない。開発は活発だけどクエリビルダで組み立てたASTからSQLを生成するクエリコンパイラが死ぬほど複雑で常人はおいそれと手を出すことができない。

getquill/quill ★1077

github.com

Twitter社のエンジニアが開発しているScalaデータベースアクセスライブラリ業界の新鋭。作者の方はマーケティングにも熱心で、この1年で約900スターが増えており一気にNo.2の座に。マクロでコンパイル時にSQLを生成するというコンセプト。ちょっと試してみたところではjoinはちゃんとjoinとしてSQLが生成されており感動した。IOモナドもあるけどオプションになっているところは良心的。最近はSparkSQL対応など色気を出している。

日本だとFOLIOさんが使っているみたいで社員の方(?)がコントリビュートもしている。でもScala関西のFOLIOさんのセッションでquill微妙と言ってたのでどのへんが微妙なのか聞いてみたい。コードはちょっとしか読んでないのでよくわからないけどマクロで実装されているので拡張しづらそうだなという印象があるのと、将来的に新しいマクロシステムにちゃんと移行されるのだろうかという不安がある。

tpolecat/doobie ★973

github.com

これも新鋭でSQLを書くタイプ。1年前からは+600スター。タイプセーフじゃないけどコンパイル時やテスト時にチェックすればいいじゃんというコンセプト(らしい)。SQLを直接書くので複雑なクエリにも対応できるという安心感があるものの、動的に変わるようなSQLは書きにくい(らしい)。自分では使ったことないのでよくわからない。

IOモナド方式でもれなくScalazまたはcatsがついてくるのがちょっと微妙かもしれない。

scalikejdbc/scalikejdbc ★826

github.com

ここまでがメジャーなデータベースアクセスフレームワークの現役世代と言っていいと思う。この1年で+100スターほど。これまでと同じペースで伸びているけどquillとdoobieの伸びが大きすぎて昨年半ばの段階で順位が逆転してしまっている。

実用的なバランスがあり使いやすい。SQLを書く方式とタイプセーフなDSLの二種類の使い方があり、他のフレームワークだと大体DSLがメインで、SQL方式はDSLではできないことがある場合の回避策みたいな位置付けになっていることが多いけど(doobieは除く)、scalikejdbcは元々SQLを書く方式で後からDSLが追加されたという経緯もあり、SQLを書く方式も便利。どちらを使うべきか悩むかもしれない。

squeryl/squeryl ★493

github.com

1年で+40スターほど。最近は吉田さんがメンテを継続されている。タイプセーフなDSLタイプで結構使いやすいと思うけど内部でランタイムリフレクションが使われているのがScala界隈的には微妙なのかもしれない。今から敢えて使うかというと微妙だけど、ケースクラス作るだけでDSLが使えるのは便利(ここにリフレクションが使われている)。quillはこれをマクロで実現しているけど、slickやscalikejdbcはケースクラスと別にテーブル定義的なものが必要で、自動生成ツールがあるとはいえそもそも作らなくていいのはなんだかんだ楽。

この次にsquerylをベースにした(中身は結構変えたという話だけど)scala-activerecordが310スターで続いており、フォークして分散してしまうのは開発リソース的にもマーケティング的にももったいないなぁと思うなど。

まとめ

スター数ではslickがダントツだけど、quillとdoobieも勢いがある。でもこの3つはどれも癖が強く、汎用的に使えるとは言い難い感じ。どれを使ったらいいか判断できない場合は大人しくscalikejdbcを使っておくのが間違いなさそう。

Webフレームワークとのスターの数を比較すると、RDBScala界隈ではあまり注目を集めるトピックではないのかもしれないという気もする。でも、なんだかんだでGitHubのスターの数は外から見たときの印象や作者のモチベーションにもなるので、気に入っているライブラリがあればスターを押しておくといいと思います。