2011-08-30 4 views
8

मैं PostgreSQL में एक enum इसलिए की तरह परिभाषित किया है:क्लोजर/पोस्टग्रेस्क्ल: मैं जेडीबीसी 4 एरे परिणामों से एनम मूल्यों का उपयोग कैसे करूं?

create type color as enum ('yellow', 'purple', 'white', 'black'); 

और मैं तो जैसे Jdbc4Array को प्राप्त कर सकते हैं:

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

:

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

यह इस तरह एक वस्तु से पता चलता लेकिन सामान्य चीजों को आजमाने का प्रयास अपवाद फेंकता है:

(.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. 

कपटी। यहां मैं क्या कर सकता हूं?

उत्तर

1

Postgresql Jdbc4Array.getArray() कार्यान्वयन के साथ कुछ बहुत अजीब चल रहा है, मैं इसे काम नहीं कर सका।

user=> (with-connection db (with-query-results rs ["select enum_range(null::color)"]  
      (.getResultSet (get (first(doall rs)) :enum_range)))) 
#<Jdbc4ResultSet [email protected]> 

अब, सरणी की सामग्री मानक ResultSet इंटरफेस के माध्यम से पहुँचा जा सकता है: लेकिन, मैं) .getResultSet (साथ कुछ सफलता है। मैं यह करने के 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> 
संबंधित मुद्दे