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))))))