加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Clojure / postgresql:如何从Jdbc4Array结果中访问枚举值?

发布时间:2020-12-13 16:17:34 所属栏目:百科 来源:网络整理
导读:我在 postgresql中定义了一个枚举,如下所示: create type color as enum ('yellow','purple','white','black'); 我可以像这样进入Jdbc4Array: (def colors ((first (sql/with-connection db/db (sql/with-query-results res ["select enum_range(null::col
我在 postgresql中定义了一个枚举,如下所示:
create type color as enum ('yellow','purple','white','black');

我可以像这样进入Jdbc4Array:

(def colors 
  ((first (sql/with-connection db/db 
    (sql/with-query-results res 
      ["select enum_range(null::color)"]
      (doall res)))) :enum_range))

这显示了这样一个对象:

#<Jdbc4Array {yellow,purple,white,black}>

但尝试通常的事情会引发异常:

(.getArray colors) => stream closed

所以我想我需要在连接关闭之前访问数组:

(def colors 
  ((sql/with-connection db/db 
    (sql/with-query-results res 
      ["select enum_range(null::color)"]
      (.getArray ((first (doall res)) :enum_range))))))

但是在这种情况下我得到了这个例外:

Method org.postgresql.jdbc4.Jdbc4Array.getArrayImpl(long,int,Map)
is not yet implemented.

险恶.我能在这做什么?

Postgresql Jdbc4Array.getArray()实现有一些非常奇怪的事情,我无法让它工作.但是,我在.getResultSet()方面取得了一些成功:
user=> (with-connection db (with-query-results rs ["select enum_range(null::color)"]     
           (.getResultSet (get (first(doall rs)) :enum_range))))
#<Jdbc4ResultSet org.postgresql.jdbc4.Jdbc4ResultSet@17cff66>

现在,可以通过标准ResultSet接口访问数组的内容.我已经从clojure.contrib.sql中复制了一些代码来执行此操作:

(defn resultset-seq
  [^java.sql.ResultSet rs]
  (let [rsmeta (. rs (getMetaData))
    idxs (range 1 (inc (. rsmeta (getColumnCount))))
    keys (map (fn [i] (. rsmeta (getColumnLabel i))) idxs)
    check-keys (or (apply distinct? keys)
               (throw (Exception. "ResultSet must have unique column labels")))
    row-struct (apply create-struct keys)
    row-values (fn [] (map (fn [^Integer i] (. rs (getObject i))) idxs))
    rows (fn thisfn []
           (when (. rs (next))
         (cons (apply struct row-struct (row-values)) (lazy-seq (thisfn)))))]
  (rows)))

给出(抱歉快速破解样式代码)

user=> (with-connection db 
         (with-query-results rs ["select enum_range(null::color)"] 
                            (get (first (resultset-seq 
                                           (.getResultSet (get (first(doall rs))
                                                              :enum_range))))
                                 "VALUE")))
#<PGobject yellow>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读