ClojureでORM。JPAの知識が必要ですが…clj-jpaこれからくる予定です。 http://qiita.com/kawasima/items/8162151c606ebb9a7d1d
slackに繋がってなかったので話題投げておきながら放置してしまった
SQLをDSLで書けるより生のSQL書いてネストしたオブジェクトとかを良い感じに扱ってくれる何かが欲しかったのですがありませんかね?
Common Lispならdataflyみたいなのがあるんですけどね。 fukamachi/datafly https://github.com/fukamachi/datafly
korma は eager loading できないんだっけか
cumin 使ったこと無いけど korma に eager loading つけてくれるんじゃなかったかな
keen さんのしたいことってマップのベクタをユーザー定義型のベクタに変えたいとかそんな感じなんですかね?(それを簡単に実現するライブラリが欲しいということ?)
いや、例えば {:name “hoge” :items [{:id 1 :type 2} {:id 2 :type 1}]}みたいなオブジェクトが欲しい時にSQLだと
SELECT name, items.id, items.type FROM users LEFT JOIN items ON items.user_id = users.id
みたいたクエリになるじゃないですか。そしてその返り値が
name = “hoge”, id = 1, type = 2
name = “hoge”, id = 2, type = 1
みたいになる訳で欲しい形とは違うので裏で変換してくれないかな、と。あー、なんとなく分かりました。
DSLでもいいんですけど出来ればSQLは生で書きたい派ですね。裏のクエリが見えないのは怖い。
honeysql とかなら普通に実行前のクエリ見れると思いますよ。
マップ組み立てていって文字列に直す、ところまでがだいたいこの類のライブラリのお仕事であとは組み立てたのを jdbc に渡すーとかが普通なんじゃないんですかね
で、 keen さんのほしがってるようなやつは僕は心当りないです、ごめんなさい
まあ、でもモジュール性が高いのでSQLの結果を良い感じにしてくれる奴と組み合わせれますね。
ちょっと疑問というかあれなんですけど datafly は SELECT name, items.id, items.type FROM users LEFT JOIN items ON items.user_id = users.id
` を {:name “hoge” :items [{:id 1 :type 2} {:id 2 :type 1}]}
いうふうに出来るんですか?
has-many オプションとかって動き的にはマクロでそれを簡単に取得出来る関数を定義してやってるだけのように見えるんですけど( keen さんの例だと user-items みたいな関数が自動で生えてくるイメージ?
この例だとnameをkeyにして同じnameでitemの部分が違えば配列にまとめるみたいな処理になります。
1クエリで必要な情報を全てもってきてアプリケーション側で加工します。
そういうことなんですね。
1オブジェクト毎にクエリ飛ばしてたら遅い(N+1クエリ問題)
それはそうでしょうね
(これは keen さんが datafly-clj を…)
うっ…
group-by?
@mopemope: お、cuminいいですね。独自マクロ組んで、inでとってきたやつをマッピングしてました。
group-by的な事ですね。今のところpartitionしてどうこうして、ってやってます
最初DSL書くのかぁって思ってスルーしたんですがcuminがやりたいことでしたね。
私の欲しい機能ってeager loadingって言うんですね。
逆というか保存する時にhas manyとかをそれぞれのテーブルに保存する機能はなんていうんですか?
@kawasima: clj-jpa、普段ジャバジャバやってる人にはヒットするかもですねー!
clj-ebeanとか探してみたけどなかった。。
clj-jpa見てて、いっそのこと型はClojure側じゃなくてJavaでってのも潔くていいのかもしれないとか思ったり
@kara_d ありがとうございますー。clj-jpaだとJPAなので当然ですが、課題感の"良い感じに"マッピングし、EagerLoadingにしておけばN+1もクリアできるわけなのですが、いかんせんJPQLがあまり受け入れられないという…
個人的にmybatisも嫌いじゃないですね。XMLは書きたくないですがS式とかで書くならアリかも。
@kawasima: 移行の苦労が少なそうなJava人材はだいたいJPAもしくはJPAライクなモデルを書いたことがあると思うので、潜在的需要はありそう。Clojureでも引き続き同じモデル使えるのか、って。
@blackenedgold: 実は僕もXMLは書きたくないなあと思ったのでednでかけたら嬉しいですね
モデルは全部Javaで作ってしまってJVM言語内で使い回すってのもアリですがedn記述でclojureのハッシュマップとベクタにしてくれるのも欲しいですよねー。
私がちょいちょい質問飛ばしてるのは研修でDSP作ってるからなんですがそれにつての発表もします。
leiningenプロジェクト中の1ファイルを実行することって出来ます? lein run-script src/some/file.clj みたいに。
あ、gen-classとjarで解決することにしました
lein exec が簡単ですね。 https://github.com/kumarshantanu/lein-exec 連続してやるにはつらいけどちょっとしたことになら結構使える
おお、まさに、ですね。