gpt4 book ai didi

sql - 使用 korma 和 clojure 生成查询子句

转载 作者:行者123 更新时间:2023-12-04 00:45:29 26 4
gpt4 key购买 nike

我正在尝试根据我传递给函数的列和值的映射生成 korma 查询条件。

我发现当一个空 map 被传递到 korma 的位置时:

(select "things"
(where conditions))

生成带有空 WHERE 的查询,这会导致 SQL 错误:

SELECT * FROM things WHERE () LIMIT 10 

但是使用这种形式:

(select "things"
(if-not (empty? conditions)
(where conditions)))

导致错误:“传递给 core$where 的参数 (1) 数量错误”

在 korma 中是否有处理动态从句的惯用方法?

更新

下面的工作,但很笨拙(注意奇怪的必要 if 格式)

(defn do-select []
(-> (select* "things")
(fields :id :data)
(limit 10)))

(defn add-constraints [query conditions]
(if (empty? conditions)
query
(where query (conditions-to-clause-map conditions))))

(select (do-select)
(add-constraints conditions)
(where (is_owner? owner)))

最佳答案

我认为如果不深入了解 korma 并尝试调用一些私有(private) API 是否有可能生成动态查询,但这是一个坏主意。您的第二个代码的问题是 selectwhere 是宏。 select 所做的是:

(defmacro select
[ent & body]
`(let [query# (-> (select* ~ent)
~@body)]
(exec query#)))

如您所见,它会将 select* 返回值线程化到下一个表单,如果您引入 if 子句会导致此线程中断,并且 where 只获取一个值(这是您的 map ),而不是获取 select* 和 map 的值,因此错误表示参数数量错误。

到目前为止,带有一些动态代码生成功能的 eval 似乎是您的 friend 。像这样的东西:

(eval `(select "things"
~(if (empty? conditions)
`identity
`(where conditions))))

我还没有尝试过,但我希望它能给你带来灵感。

关于sql - 使用 korma 和 clojure 生成查询子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10961285/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com