pri*_*ing 8 postgresql jdbc clojure
我在postgresql中定义了一个枚举,如下所示:
create type color as enum ('yellow', 'purple', 'white', 'black');
Run Code Online (Sandbox Code Playgroud)
我可以像这样进入Jdbc4Array:
(def colors
((first (sql/with-connection db/db
(sql/with-query-results res
["select enum_range(null::color)"]
(doall res)))) :enum_range))
Run Code Online (Sandbox Code Playgroud)
这显示了一个这样的对象:
#<Jdbc4Array {yellow,purple,white,black}>
Run Code Online (Sandbox Code Playgroud)
但尝试通常的事情会引发异常:
(.getArray colors) => stream closed
Run Code Online (Sandbox Code Playgroud)
所以我想我需要在连接关闭之前访问数组:
(def colors
((sql/with-connection db/db
(sql/with-query-results res
["select enum_range(null::color)"]
(.getArray ((first (doall res)) :enum_range))))))
Run Code Online (Sandbox Code Playgroud)
但是在这种情况下我得到了这个例外:
Method org.postgresql.jdbc4.Jdbc4Array.getArrayImpl(long,int,Map)
is not yet implemented.
Run Code Online (Sandbox Code Playgroud)
险恶.我能在这做什么?
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>
Run Code Online (Sandbox Code Playgroud)
现在,可以通过标准 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)))
Run Code Online (Sandbox Code Playgroud)
这给出了(抱歉快速破解风格的代码)
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>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1024 次 |
| 最近记录: |