clojure: как конвертировать jdbc4array в seq clojure? - PullRequest
4 голосов
/ 19 мая 2011

Я пытался запросить данные из базы данных с помощью 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

Как преобразовать этот массив в seq / vector в clojure?Я пробовал (seq jdbc-array) и (seq (.getArray jdbc-array), но оба не работают ...

Ответы [ 2 ]

7 голосов
/ 11 сентября 2014

Если опция с соединением кажется вам неуклюжей (она мне подходит), вы можете расширить протокол IResultSetReadColumn для преобразования объектов Jdbc4Array в обычные или векторы:

Вот один из способов сделать это:

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

это преобразует все типы массивов в векторы при чтении

, этот подход также может помочь с типом данных JSON, как в в этом примере

3 голосов
/ 19 мая 2011

Хорошо, я понял. Мне нужно вызвать getArray, прежде чем clojure закроет соединение, иначе оно даст ноль.

Не знаю, почему ... Я думаю, что лень clojure.

;work
(with-connection *db*
  (with-query-results rs ["select * from refgene limit ?" 5]
    (seq (.getArray (:exonends (first rs))))))
...