DBIx::Skinny

いまさっきcodereposDBix::Skinnyというものをimportしました。
http://coderepos.org/share/browser/lang/perl/DBIx-Skinny


昨今のDBICブームで利用者は増えてきたんですが、いろいろ使うにあたって、
ここまでORマッパーでいろいろ(JOINしたり、キャッシュしたり)やるのはどうなんだとか、
うんたらかんたら考えたら自分で作ってしまえてのが動機でした。


DBICははっきり言ってどでかいライブラリなので一からソースを読むのがかなり大変です。
仕事で使ってる関係上、仕方なく見ることもありますが、キツい。


あと、DBICを使っているとJOINしたSQLがある意味簡単に発行できるので
重宝するのですが、ぶっちゃけどういうSQLが発行されているか全部ちゃんと見てる人って
どれくらいいるのだろうと思ったり。
DBICによって発行されるSQLがどれくらい頭の悪い感じに仕上がるのかとか
(それは使い方の問題だったりもしますが)
毎回DBICが発行するSQLをEXPLAINみんなちゃんとしてるのかな?とか。


一時期のDBIC期だったときは複雑なHashを組み上げて、
「おおすげーこんな事までできるDBIC++」とか思ってたんですが、
後から見たり人の組み上げた複雑なHashがすぐにどういうSQLになっているのか理解できなかったりして、
これ結局生のSQLを書いた方がよくない?というのが多々あり、
最近では一部生SQLで書いてたりしてました。


DBICではdbhが普通にとれるので、普通に生のSQLを発行できるのですが、
inflateしてくれないのが残念でしたね。


ああ生SQL発行した時にinflateとか、utf8-flagあたりを処理してくれたら言う事ないのになーとかおもったので
前回のYokohama.pm#02でもつぶやいたのですが、


まあ自分でいっちょやってみよっと思って作り始めました。


ちょっと古いですが、作り始めたころに社内でやったプレゼンの資料が
http://nekokak.org/presen/mf01/
ここにありますので、だいたいここに言いたい事が纏まってるような全然纏まっていないような感じなのですが、
ざっくりとした方針は書いてある気がします。


で、DBIx::Skinnyの機能としては

  1. 生のSQLを発行した時にinflateとかutf8-flagを処理してくれる
  2. update,insert,deleteはDBICというかよくあるORマッパーみたいにできる
  3. 簡単なselectもよくあるORマッパーみたいにできる

これだけです。

  1. 生のSQLを発行した時にinflateとかutf8-flagを処理してくれる

が今回の肝なんですが、発行するSQLSQL::Parserで解析して云々しています。
もっといい方法があればいい気もしつつこれ以外思いつかなかった。


updateなどなどはSQL::Abstract::Limitをつかってます。
個人的にはDODで使ってるData::ObjectDriver::SQLが好きなので外だししてほしかったりするんですが、
まあとりあえずSQL::Abstract::Limitでいいかなと。


まあソースも微妙なところもあり、結構適当にこんな感じかなと作ってたのをwassrでつぶやいたら
Yappoさんからci!ci!と言われたのでとりあえずimportしときますた。
あれなところもありますが、まあ興味のある人はのぞいてみてくださいまし。


言いたい事が纏まってるような纏まってないような感じですがこんな感じで。


久々の長文エントリでした。


Yokohama.pmが開催されるとモチベーションがあがってもっと開発するとかしないとか。