gpt4 book ai didi

clojure - 处理数据库查询结果集时抛出错误

转载 作者:行者123 更新时间:2023-12-04 06:20:05 24 4
gpt4 key购买 nike

任何人都可以帮助我理解为什么我的代码(见下文)导致以下错误:

Exception in thread "main" java.lang.UnsupportedOperationException: nth not supported on this type: PersistentStructMap


(defn search [query]
(with-connection db
(with-query-results rs [query]
(doseq [[k v] rs]
(println v)))))

(search (nth *command-line-args* 0))

最佳答案

rs是一个序列(列表),代表结果集中的所有记录。 rs的每个元素是表示单个记录的哈希映射,映射中的键/值对表示该记录的字段名称和值。您正在尝试执行与此等效的操作:

user> (let [rs [{:id 1 :val "foo"} {:id 2 :val "bar"}]]
(doseq [[k v] rs]
(println v)))
; Evaluation aborted.
; nth not supported on this type: PersistentArrayMap

这是试图将每个 map 解构为 [k v] ,大致相当于:
user> (let [k (nth {:id 1 :val "foo"} 0)
v (nth {:id 1 :val "foo"} 1)])
; Evaluation aborted.
; nth not supported on this type: PersistentArrayMap

如果您尝试打印每条记录中每个字段的值,则需要执行以下操作:
user> (let [rs [{:id 1 :val "foo"} {:id 2 :val "bar"}]]
(doseq [record rs
[k v] record]
(println v)))
foo
1
bar
2

“对于结果集中的每条记录,对于该记录中的每个键/值,打印该值。”

如果您的结果集只包含一条记录(或者您只关心其中的一条)并且您试图遍历该条记录的字段,则通过 doseq只有 first :
user> (let [rs [{:id 1 :val "foo"}]]
(doseq [[k v] (first rs)]
(println v)))
foo
1

“对于结果集第一条记录中的每个键/值,打印该值。”

关于clojure - 处理数据库查询结果集时抛出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6698959/

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