Korma:或者动态生成where子句

时间:2014-07-14 17:02:12

标签: clojure korma

我有一组动态生成的参数,如地图形式,如

(def clauses {:apples 23 :plums 0 :bananas 7})

我希望在where语句中使用它,因此它应该等同于Korma查询:

(select fruit-shop
  (where (or {:apples 23}
             {:plums 0}
             {:bananas 7})))

生成地图列表非常简单:

(map #(apply array-map %)
     (into [] clauses))

但是不能使用(or语句应用于它,因为它在宏扩展时处理,在clauses绑定到它的值之前。

在这种情况下应该使用什么声明?

1 个答案:

答案 0 :(得分:0)

在熟悉Korma源代码后,我发现korma.sql.fns/pred-or函数替换了orwhere中的having语句。所以我编写了以下带有map参数的辅助函数

(require '[korma.sql.fns :refer [pred-or]])

(defn or*
  [m]
  (apply pred-or
         (map #(apply array-map %)
              (into [] m))))

鉴于此,预期的查询将如下所示

(select fruit-shop
  (where (or* clauses)))