ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

ScalaコミュのORマッパ(O/RM) DB Flavor

  • mixiチェック
  • このエントリーをはてなブックマークに追加
ORマッパ(O/RM) DB Flavor

DB FlavorというSQLベースのシンプルなORマッパを作っています。

たとえば、以下のようなコードを書きます。

----
class Person {
@DBField var id: Int = 0
@DBField var name: String = ""
@DBField var udate: Date = null
@DBField var utime: Date = null
override def toString = "Person(" + ...
}

val db = new DBFlavor(
classOf[org.apache.derby.jdbc.EmbeddedDriver],
"jdbc:derby:DB/TestDB;create=true")

db.execute(
"CREATE TABLE PERSON(id int primary key, name varchar(255), udate date, utime time)")

for ((id, name) <- List((1, "Foo"), (2, 'Boo), (3, "Bar")))
db.execute("INSERT INTO PERSON(id, name, udate, utime) VALUES(?, ?, ?, ?)",
id, name, new Date, new Date)

for (row <- db.executeQueryObject(
"SELECT id, name, udate, utime FROM PERSON", classOf[Person]))
println(row)

db.close
----

これを実行すると、

Person(id=1,name=Foo,udate=2009-02-20,utime=23:24:37)
Person(id=2,name=Boo,udate=2009-02-20,utime=23:24:37)
Person(id=3,name=Bar,udate=2009-02-20,utime=23:24:37)

と表示されます。

今のところ検索(SELECT)のみORマッピングされますが、上記のコードの通り、INSERT/UPDATE/DELETEなどのDDL/DMLを書いて'?'に入れる値用意してDBFlavor#executeを実行すれば、適当に型を変換してくれて実行してくれます。

検証がまだまだ足りませんが、テンプレート形式になっていてSQLインジェクションなどが生じにくいようにはなっていますし、JDBCをちょっとラップしたものなんですが、JDBCを直接使うより簡単になっています。

まだ公開していないのですが、欲しい人いますか?
また、要望などもあれば是非言ってやって下さい。

コメント(10)

けいすけさん、はじめまして。
日ごろ、Lift(現在は、0.11)を使った試作開発を行っている者です。

Liftのmapperは、O/Rマッパーにとどまらない機能も盛り込まれていて
(例、ユーザー認証関連の機能全般を盛り込んだMetaMegaProtoUser)
興味深いものなのですが、マスターするのがけっこう大変です
(Breaking Changeも多いですし・・・)

Web Flavorはまだ使わせてもらったことはないのですが、興味深く情報を拝見させてもらっております。
個人的には、以下のような機能がほしいです。
■iBatis相当のラッパーでScalaの機能を活かした記述ができること
 => 提示板多いたものがまさしく、この方向性上にあると思います!
■複数データベース対応がやりやすいこと
 => 例えば、認証・ロール関係のデータベースと、フロントエンド関係のデータベースが切り分けられる

web flavorの発展、かなり期待いたしております!

木村
喫茶津仕事人さん、こんばんは。コメントありがとうございます。

> iBatis相当のラッパーでScalaの機能を活かした記述ができること

iBatisは本格的に使ったことがないため、どのような点がいいのか、教えていただけると幸いです(XMLで挫折した口ですので)。
いいと思える点があれば取り込んでいきたいと思います。

今のポリシーは、生SQL/JDBCを使いやすくすることに注力しているところです。
ただ実際にデータベースアプリを書いていると、一般的な場面でSQLを抽象化したい要望にはかられるので、SELECT/UPDATE/DELETE/INSERTやDMLに関してある程度SQLを書かなくてもいいよう、実装を考えているところです。
#ActiveRecord/ActiveObjectsに近い感じになりそうです。

> 複数データベース対応がやりやすいこと
>  => 例えば、認証・ロール関係のデータベースと、フロントエンド関係のデータベースが切り分けられる

これについては、Web Flavorのポリシーにも関連してくるのですが、基本的にWeb Flavorはシンプルなインフラを目指しているので、特化したもの、複雑なものはさけることにしています。

ただ必要なものと思われるものは随時実装・取り込んでいきたいので、

* 基礎的な部分はWeb Flavor/DB Flavorがインフラを作る
* その上にライブラリをラップする

を踏襲しながら検討したいと思います。

というのは、今フレームワークで問題になっているのは、

* Webフレームワークの複雑化による、学習・実装・運用コストの増大

だと思うからです。

Liftを使わずにWeb Flavorをわざわざ作っているのは、このあたりが関係しています。

私自身は勉強するのが嫌いなもので、フレームワークを勉強するくらいなら、自分で作ってしまえ、という人間ですので(^^;;。

----

> 複数データベース対応がやりやすいこと

ちなみに現状でも複数データベースに接続することはできますが、どんな点でしょうか?
たぶん、実装面・運用面でなにかあると思うので、教えていただけると幸いです。
けいすけさん、さっそくのお返事ありがとうございます。

日ごろ、ScalaのシンプルなO/Rマッパーが欲しいな、と思っておりまして、
昨晩は、うれしさのあまり、あまり考えずにコメントしてしまいました。。

データベースが苦手な人間なので、
実のところ、偉そうなことは書けないので、
LiftのMapperのネタ的(反面教師的)なところから。
#・・たまたま昨晩から、Lift MLで議論になってました。
LiftのMapperのクラスにはView関連のものまで一緒くたになってます。
MetaMegaProtoUserというものものしい名前のものや、
ActiveRecordの影響であろうCrudifyなど。

これは、Liftなりに迅速な開発を目指した結果らしく、
確かに、MetaMegaProtoUserを使うと、ユーザID・メール承認からユーザ認証・アクセス制御まで
一気に作ることができます。Crudifyの方はいうまでもなくScafoldです(あまり使われてないのでしょうが)。さらに、JPAラッパーのみならず、ODB対応(db4oネタが転がってます)から、OAuth対応まで、
クラス名を見るだけでもてんこ盛りです。

ただし、迅速に開発できるのは、現状ではソースを読み込んだ後で、です。
(加えて、日本語対応させようと思うと、これらのクラスを単にextend/withして使うのは厳しい感じなので、かなり俺様クラスにソースを書き換えて。。)
実際には複数データベース対応が思うように動かなかったりなんだりあります・・・
(すみません、昨日のコメントは
このあたりで時間を潰した後だったもので、当たり前のことを書いてしまいました。)

・・・過半数のソースは読んでしまった(読む羽目になった)後なので、
 個人的には、Mapperのことはそんなに嫌いでないのですが、やはり、
 Mapperは強制力がなきゃ(=>サービスインに間に合わせるには、もはやこれしかない)
 ここまで使うことはないな、というのが正直なところです。

 iBatisは多少試しただけで、やはりSQLよりもO/Rマッパーに流れてしまったのですが、
 すくなくとも、データアクセスに関するコードを一箇所にまとめておきやすいのは魅力的だな
 と思います(あまりにXML/SQLによっているとは思いますが、シンプルで覚えること少ないですし)。

けいすけさんの書かれたコメントを読みまして、私が付け加えるようなことは
ほとんどないと思いました(すばらしいです)。
できましたら、早くコードを拝見させていただき、
1ユーザーとして、ライブラリ作りに御協力できましたらと考えます!

Liftとweb flavorのアプローチ、真逆でgoing my wayなのが、両者ともに心地いいです(笑)

・・・次の案件(GW明けくらいから?)もScalaで行きたいと考えておりまして、
その際に、web flavor/DB flavorを使いたいな、思っております :)
・・・(別にたいしたことはないのですが)、
 ちょっと気になってソースを見直してみたら、liftからdb4oへの呼び出しは
mapperのクラスを使っていませんでした。すみません。

DataService.getCourses.flatMap(
course => bind("field", xhtml,
"name" -> Text(course.name),
  ・・・・

なんていう、Liftらしい記法がもりだくさんなので、mapperもいる気になってました。
やはりLiftは、記憶にとどめるのが困難なくらい盛りだくさんですね。。。
> MetaMegaProtoUserを使うと、ユーザID・メール承認からユーザ認証・アク
> セス制御まで一気に作ることができます。
> Crudifyの方はいうまでもなくScafoldです(あまり使われてないのでしょう
> が)。
> さらに、JPAラッパーのみならず、ODB対応(db4oネタが転がってます)から、
> OAuth対応まで、クラス名を見るだけでもてんこ盛りです。
...

まさにカオスですね。

もちろんこれはこれでありだと思うのですけど、学習コストがかかりそうで
あまり好きじゃないかもしれません。

> すくなくとも、データアクセスに関するコードを一箇所にまとめておきや
> すいのは魅力的だなと思います(あまりにXML/SQLによっているとは思いま
> すが、シンプルで覚えること少ないですし)。

Twitterでいろんな人に聞いてみると、基本的なコンセプトはiBatisとは似て
いるようです。

ただマップやSQLを外部ファイルに定義したり、冗長でわかりにくい面があっ
たので(現在は改善されているようなのですが)、そういうのともちょっと違う
かなと。

Apache Cayenneは、またDataContextがあって別のものになってますし、それ
らと差別化するつもりはないのですが、もうちょっと自分が好きなスタイルに
したいなと思っています。
#実装コストも含めて。

> できましたら、早くコードを拝見させていただき、
> 1ユーザーとして、ライブラリ作りに御協力できましたらと考えます!

はい、今週中に適当にパッケージ出します。
Apache Derbyもいれちゃうのでかなりでかいかもしれませんが(^^;。

日記にも書きましたが、ある程度SQLを隠蔽してかつ書きやすいテンプレート
も考えつつあります。

> ・・・次の案件(GW明けくらいから?)もScalaで行きたいと考えておりまし
> て、その際に、web flavor/DB flavorを使いたいな、思っております :)

その時は是非。どんどん要望出してください。
Scalaで仕事はなかなかリスキーではあるんですが、そろそろ始めないといけ
ませんしw。
#私もWeb Flavor/DB Flavorを仕事で使うことを妄想しているところです。
>Scalaで仕事はなかなかリスキーではあるんですが
言うまでもなく(笑)。

今回、比較的時間に余裕のある試作プロジェクト&1人プロジェクトということで、
Scala/Liftでいかせてもらいましたが、ほぼ毎日終電帰りとなりました。
 ※確信犯なので、半ば予想通り。楽しみの方がなんとか大きい・・・ですね。

プロジェクト後半では、C++の経験者2人に加わっていただき、
(Javaやってる人よりも無謀な話に加わってもらいやすいかも)
一緒に終電帰りしてもらってます。

おそらく3月半ばまで、Liftのバージョンアップ対応できつきつなのですが、
DB Flavorパッケージ、楽しみにお待ちしております。
カチンコ
次の案件では、もう少しおくなしく、かつ、実用的なアプリ開発をすることになると思うので、
けいすけさんのWeb Flavor/DB Flavorを使わせていただき、
普通の仕事にしたいなぁ、と思ってます!
正直言うと、Web FlavorもDB Flavorも大きなプロジェクトを行うほどのインフラは築けていなくて、精進をしなくてはいけない状態です。

当面はそういう意味でもみなさんの意見を伺いながら方向性を探っていく必要がありそうですね。

で、実はみなさんにお願いがあるのですが、必要な機能などを探る為に1つ中くらいのWebアプリケーションサンプルを作ろうと考えています。

* 比較的一般的なWebアプリケーション
* 画面数は5以上
* DBは複数のテーブルを使う

こんな条件で何かアイデアをいただけないでしょうか。
こんばんは。
最近は喫茶店でなくマクドにこもっていることの多い喫茶津仕事人こと木村です。
いろいろコメントさせていただいたついでに、、

■テレビや映画番組にエクストラの方向けの情報提供サイト
というのはいかがでしょうか?
例題として適切かどうかは?ですが、
こちら上記の条件を満たします。

よくテレビ・映画のエキストラに出演している映像技術者の方からアイデアをもらいまして、
Liftで作ってみようかな、と思っているところでした。
画面数は10以下なのは明らかなので、Liftよりもweb flavor向けかと思います。

※要件等、ちょっと別投稿にしてみます。
DB Flavor 0.0.1リリース

http://cappuccino.jp/keisuken/scala/DBFlavor/DBFlavor-0.0.1.zip(10.6MB)

ドキュメントはありません。使い方も日記に書いてる以外の機能はないです。
DB Flavorの仕様書を書きつつあります。

http://cappuccino.jp/keisuken/scala/DBFlavor/

まだあくまでもメモ的なもので、書きなぐっていますが、だいたいの雰囲気をつかんでいただければと思って公開しました(随時更新します)。

なお、名称についてですが、
Web Flavor : Webフレームワーク
DB Flavor : O/Rマッピング
です。
SourceForgeなどはプロジェクト名で止むを得なくwebflavorになっていますが、
正式には「Web Flavor」で、O/Rマッパは「DB Flavor」です。
何か転記する時はこちらの名前でお願いしますm(_ _)m。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

Scala 更新情報

Scalaのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。