4

jdbcでデータベースからデータをクエリしようとしました。問題は、一部の列が配列型であることです。

;get that particular column
(def jdbc-array (with-connection *db*                                                                    
                  (with-query-results rs ["select * from refgene limit 5"]                                        
                    (:exonstarts (first rs)))))

;Check if it has a value
(print jdbc-array)
;#<Jdbc4Array {67075873,67078739,67085754,67100417,67109640,67113051,67129424,67131499,67143471,67162932}>nil

;check class
(class jdbc-array)
;org.postgresql.jdbc4.Jdbc4Array

clojure でこの配列を seq/vector に変換する方法は? (seq jdbc-array) と (seq (.getArray jdbc-array) を試しましたが、どちらも機能しません...

4

2 に答える 2

7

with-connection オプションが不格好に思える場合 (私にはそうです)、IResultSetReadColumn プロトコルを拡張して、Jdbc4Array オブジェクトを通常のオブジェクトまたはベクトルに変換できます。

これを行う1つの方法は次のとおりです。

(extend-protocol clojure.java.jdbc/IResultSetReadColumn
  org.postgresql.jdbc4.Jdbc4Array
  (result-set-read-column [pgobj metadata i]
    (vec (.getArray pgobj))))

これにより、読み取り時にすべての配列型がベクトルに変換されます

このアプローチは、この例のように JSON データ型にも役立ちます

于 2014-09-11T18:43:36.397 に答える
3

はい、分かりました。clojure が接続を閉じる前に getArray を呼び出す必要があります。そうしないと、nil が返されます。

理由はわかりません...私の推測では、clojureの怠惰です。

;work
(with-connection *db*
  (with-query-results rs ["select * from refgene limit ?" 5]
    (seq (.getArray (:exonends (first rs))))))
于 2011-05-19T17:45:43.350 に答える