为什么 eval 在 Korma 中构建 WHERE 条件时在宏不起作用的地方工作



我正在尝试将 WHERE 条件动态添加到 Korma SQL 查询中

(-> 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的新手

不起作用的原因是,在这两种情况下,params参数的值都是符号params。这就是为什么在add-where-conditions-2add-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的替代品来吃蛋糕并拥有它。

相关内容

  • 没有找到相关文章

最新更新