Korma:或动态生成 where 子句



我有一组动态生成的参数,其形式类似

(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绑定到它的值之前。

在这种情况下应该使用什么语句?

在熟悉了Korma源代码后,我发现korma.sql.fns/pred-or函数取代了wherehaving中的or语句。因此,我编写了以下辅助函数,它接受一个映射参数

(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)))

相关内容

  • 没有找到相关文章

最新更新