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

时间:2011-07-14 19:36:05

标签: clojure

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

  

线程“main”中的异常java.lang.UnsupportedOperationException:   此类型不支持:PersistentStructMap

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

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

1 个答案:

答案 0 :(得分:3)

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

这是试图将每张地图解构为[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

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