2011-06-13
ScalaでどうしてもSQLっぽく書きたかった
反省はしていない。
falsus/mysqala ? GitHub
Scalaの勉強用に極力MySQLっぽくScalaの通常の機構のみでかけないかをやってみた。
あとでサンプルコード貼ります
create table users(id int primary key, name varchar(255));
って言うテーブルがある場合
class User(val id: Int, val name: String) { } class Users(connManager: ConnectionManager) extends Table[User](connManager) { val id = getIntColumn("id") val name = getStringColumn("name") def print(offset: Int, max: Int) { val query = select (id, name) from this limit max offset offset query.execute(_(0) match { case u: User => println(u.id + ":" + u.name) }) } def find(id_ : Int) = { val query = select this.* from this where id == id_ var user: Option[User] = None query.execute(_(0) match { case u: User => user = u }) user } }
こんな感じになる。executeの中の一つを返すコードがきったないなあ。
O/Rマッパーとしての使い勝手を考慮していないし、リフレクションそのまま使っててパフォーマンスも気にしていない。
英語力が皆無なためgithubに上記言い訳を書くことすらできない。
結果としてわかったのは以下のような結果だった。
- 可変長引数を受け取るSELECT等の場合は()を付けないと無理
- ORDER BYのようなパラメーター0で()無しで関数をチェインできない
- INSERT INTOのようにレシーバーからスタートする場合は引数0個でも行ける
- =演算子は書き換えられるけどUnit
まだScala勉強中の身なので、こうすればもっとSQLっぽくかけるよ!とか、Scalaっぽく書くにはこうだよ!と言ったご意見を頂けるとありがたいです。
トラックバック - http://d.hatena.ne.jp/falsus/20110613/1307981971
リンク元
- 5 http://pipes.yahoo.com/pipes/pipe.info?_id=5c957097ed152660234169b605fb3fa7
- 3 http://pipes.yahoo.com/pipes/pipe.info?_id=6ffca3d513899ee44c0d1201c766e92c
- 2 http://www.google.co.jp/reader/view/
- 1 http://www.google.co.jp/
- 1 http://www.google.co.jp/search?client=ubuntu&channel=fs&q=mysqala&ie=utf-8&oe=utf-8&hl=ja
- 1 http://www.google.co.jp/search?hl=ja&q=scala++SQL&oq=scala++SQL&aq=f&aqi=&aql=&gs_sm=e&gs_upl=18464l23032l0l12l10l0l0l0l0l0l0ll0
- 1 http://www.google.co.jp/search?q=scala&btnG=検索&num=100&hl=ja&lr=lang_ja&client=firefox-a&tbo=1&rls=org.mozilla:ja:official&biw=1280&bih=832&tbs=qdr:d,lr:lang_1ja&sa=2
- 1 http://www.google.co.jp/search?q=scala&hl=ja&lr=lang_ja&tbs=lr:lang_1ja,sbd:1&tbm=blg&ei=PNb6Tb-kCoLOvQPyq-SHAw&start=20&sa=N&biw=911&bih=693
- 1 http://www.google.com/reader/view/