Clojure jdbc-查询单列展平结果

时间:2019-02-14 00:57:46

标签: jdbc clojure

我正在尝试将数据(大约760k行)从单列读取到一个(平展的)向量中。 clojure.java.jdbc/query的结果是地图的序列,例如({:key "a"} {:key "b"} ...)。提供选项:as-arrays? true后,将返回[[:key] ["a"] ["b"] ...]。为了使结果平坦,我还使用了选项:row-fn first并得到了[:key "a" "b" ...]。最后,我应用了rest来摆脱:key

用向量包装和展开行似乎是很多不必要的工作。我对表现也不满意。有没有更快/更惯用的方式?我已经尝试过...

(jdbc/with-db-connection [con -db-spec-]
  (with-open [^Statement stmt (.createStatement (:connection con))
              ^ResultSet res  (.executeQuery stmt query)]
    (let [ret (ArrayList.)]
      (while (.next res)
        (.add ret (.getString res 1)))
      (into [] ret))))

...但是速度并不快,而且很丑。


编辑

更小巧的方法是通过换能器(请参见here):

(into []
      (map :key)
      (jdbc/reducible-query
       connection
       ["SELECT key FROM tbl"]
       {:raw? true}))

1 个答案:

答案 0 :(得分:1)

您可以只使用:row-fn :key。不知道您期望什么性能,但是在我的i5 PC上,检索760K记录花费了大约3秒钟(基于H2文件的数据库)

(time
 (count
  (jdbc/query db ["select top 760000 key from table1"] {:row-fn :key})))
;; => 760000

"Elapsed time: 3003.456295 msecs"