我正在尝试向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 为的参数列表创建函数,如:(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的新手
答案 0 :(得分: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]) ,,,))
,这就是{ {1}}宏期望并知道如何处理。
where
宏解析表达式以搜索用于构建表达式的一些谓词。 where*
,功能替代,没有那种功能,所以我不能想到where
替代吃蛋糕和替代它。