clojure: как преобразовать jdbc4array в seq clojure?

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

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

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

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

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

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

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

Не уверен, почему... Я думаю, лень Clojure.

;work
(with-connection *db*
  (with-query-results rs ["select * from refgene limit ?" 5]
    (seq (.getArray (:exonends (first rs))))))
Другие вопросы по тегам