Clojurepostgresql:如何从Jdbc4Array结果中访问枚举值?

Clojurepostgresql:如何从Jdbc4Array结果中访问枚举值?,第1张

概述我在 postgresql中定义了一个枚举,如下所示: create type color as enum ('yellow', 'purple', 'white', 'black'); 我可以像这样进入Jdbc4Array: (def colors ((first (sql/with-connection db/db (sql/with-query-results res 我在 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>
总结

以上是内存溢出为你收集整理的Clojure / postgresql:如何从Jdbc4Array结果中访问枚举值?全部内容,希望文章能够帮你解决Clojure / postgresql:如何从Jdbc4Array结果中访问枚举值?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1166273.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存