4

Korma SQL クエリに WHERE 条件を動的に追加しようとしています

(-> the-query
    (where {:archived false})
    (add-where-conditions params)
    (limit 200)
    (select))

korma のwhere関数への呼び出しを動的に構築しようとしています。呼び出しは次のようになります(where query (or (between :freq [100 200]) (between :freq [300 400]) ... ))。ヘルパー関数make-condsは、次のようなwhere関数の引数のリストを作成します。(or (between :freq [100 200]) ...

動的な where 呼び出しを構築するために、次のアプローチを試みました。最初のもの、作品のあるもののみeval。なんで?これを行うより良い方法はありますか?

(defn add-where-conditions [query params]
  (eval (list 'where query (make-conds params))))

(defmacro add-where-conditions-2 [query params]
  (list 'where query (make-conds params))) ; broken

(defmacro add-where-conditions-3 [query params]
  `(where ~query ~(make-conds params))) ; broken

免責事項: 私は Clojure と Korma の初心者です

4

1 に答える 1

1

マクロが機能しない理由は、どちらの場合もparams引数の値がシンボルであるためparamsです。これが、マクロが呼び出しを行うときに、関数が受け取る値が、考えているリストではなく、シンボルでadd-where-conditions-2あり、次の行にエラーを示す理由です。add-where-conditions-3(make-conds params)params

IllegalArgumentException Don't know how to create ISeq from: clojure.lang.Symbol  clojure.lang.RT.seqFrom (RT.java:505)

params最初のケースは、関数が引数の値として (シンボルではなく)evalリストを受け取り(where {:your-query nil} (or (between :freq [100 200]) ,,,))whereマクロが期待し、処理方法を知っているリストを受け取るため、機能します。

whereマクロは、式を構築するために使用するいくつかの述語を検索して、式を解析します。where*関数の代替である にはそのような機能はありませevalん。

于 2013-06-17T20:22:11.197 に答える