Closed pavel-klavik closed 4 years ago
The error is due to the fact that conman switched to using jdbc.next instead of clojure.java.jdbc, you'd have to update the code as follows to be compatible. I'll update the docs to match the change.
(ns <app>.db.core
(:require
[cheshire.core :refer [generate-string parse-string]]
[next.jdbc.date-time]
[next.jdbc.prepare]
[next.jdbc.result-set]
[clojure.tools.logging :as log]
[conman.core :as conman]
[myapp.config :refer [env]]
[mount.core :refer [defstate]])
(:import (org.postgresql.util PGobject)))
...
(defn pgobj->clj [^org.postgresql.util.PGobject pgobj]
(let [type (.getType pgobj)
value (.getValue pgobj)]
(case type
"json" (parse-string value true)
"jsonb" (parse-string value true)
"citext" (str value)
value)))
(extend-protocol next.jdbc.result-set/ReadableColumn
java.sql.Timestamp
(read-column-by-label [^java.sql.Timestamp v _]
(.toLocalDateTime v))
(read-column-by-index [^java.sql.Timestamp v _2 _3]
(.toLocalDateTime v))
java.sql.Date
(read-column-by-label [^java.sql.Date v _]
(.toLocalDate v))
(read-column-by-index [^java.sql.Date v _2 _3]
(.toLocalDate v))
java.sql.Time
(read-column-by-label [^java.sql.Time v _]
(.toLocalTime v))
(read-column-by-index [^java.sql.Time v _2 _3]
(.toLocalTime v))
java.sql.Array
(read-column-by-label [^java.sql.Array v _]
(vec (.getArray v)))
(read-column-by-index [^java.sql.Array v _2 _3]
(vec (.getArray v)))
org.postgresql.util.PGobject
(read-column-by-label [^org.postgresql.util.PGobject pgobj _]
(pgobj->clj pgobj))
(read-column-by-index [^org.postgresql.util.PGobject pgobj _2 _3]
(pgobj->clj pgobj)))
(defn clj->jsonb-pgobj [value]
(doto (PGobject.)
(.setType "jsonb")
(.setValue (generate-string value))))
(extend-protocol next.jdbc.prepare/SettableParameter
clojure.lang.IPersistentMap
(set-parameter [^clojure.lang.IPersistentMap v ^java.sql.PreparedStatement stmt ^long idx]
(.setObject stmt idx (clj->jsonb-pgobj v)))
clojure.lang.IPersistentVector
(set-parameter [^clojure.lang.IPersistentVector v ^java.sql.PreparedStatement stmt ^long idx]
(let [conn (.getConnection stmt)
meta (.getParameterMetaData stmt)
type-name (.getParameterTypeName meta idx)]
(if-let [elem-type (when (= (first type-name) \_)
(apply str (rest type-name)))]
(.setObject stmt idx (.createArrayOf conn elem-type (to-array v)))
(.setObject stmt idx (clj->jsonb-pgobj v))))))
I updated the docs in Luminus. Going to close the issue, but feel free to reopen if it's still not working.
I am getting the following value from a SELECT where val is of type JSON.
After downgrading back to 0.8.4, I am getting JSON parsed as Clojure map correctly. The parsing is done by this code, based on luminus template: