Actually, re-reading the jdbc/query doc
http://clojure.github.io/java.jdbc/#clojure.java.jdbc/query
I can't find any reference to this ":connection" keyword param.. may I ask
where you got it from?
On Wednesday, October 2, 2013 9:50:13 AM UTC-4, Christian Jauvin wrote:
>
> Ah finally, thanks John, the "with-open" pattern was indeed the missing
> piece: it works!
>
> Just to summarize, here's what works for me:
>
> (extend-type org.postgresql.jdbc4.Jdbc4Array
> json/JSONWriter
> (-write [o out]
> (json/-write (.getArray o) out)))
>
> ; plus any other additional required custom JSON writers
> (java.sql.Timestamp, Date, etc)
>
> (with-open [conn (jdbc/get-connection *db*)]
> (json/write-str
> (jdbc/query {:connection conn}
> ["select * from <table with PG array in it>.."])))
>
>
>
> On Wednesday, October 2, 2013 12:06:44 AM UTC-4, John Hume wrote:
>>
>> I don't use clojure.java.jdbc, so this may be non-idiomatic or just
>> wrong, but have you tried something like
>>
>> (with-open [connection (jdbc/db-connection *db*)]
>> (json/write-str
>> (jdbc/query {:connection connection}
>> ["SELECT * FROM..."])))
>>
>>
>>
>> On Tue, Oct 1, 2013 at 8:13 PM, Christian Jauvin <[email protected]>wrote:
>>
>>> Hi Philippe,
>>>
>>> The Jdbc4Array that's causing me trouble is not the "outer" one,
>>> returned from jdbc/query: that one seems to be properly handled by
>>> json/write-str.
>>>
>>> The problem happens with a Postgres table containing a text[] column:
>>>
>>> create table something (
>>> something_id serial primary key,
>>> list_of_something text[]
>>> )
>>>
>>> In that case the query returns an ("inner") array for each record, and
>>> it gets converted to a Jdbc4Array, which, when passed to the JSON
>>> writer, causes the problem.
>>>
>>> Querying a table without a PG array works perfectly fine though.
>>>
>>>
>>>
>>> On Tuesday, October 1, 2013 4:21:33 PM UTC-4, Philippe Guillebert wrote:
>>>
>>>> Hi,
>>>>
>>>> You probably need to realize your query using (doall (jdbc/query ...))
>>>>
>>>> Also, I was wondering, depending on your needs, you could convert
>>>> Jdbc4Array into a native type (vector ?) as a post-processing function
>>>> of your query and forget about registering JSON writers.
>>>>
>>>>
>>>>
>>>> On Tue, Oct 1, 2013 at 9:00 PM, Christian Jauvin <[email protected]>wrote:
>>>>
>>>>> Hi Roman,
>>>>>
>>>>> This approach works for java.sql.Timestamp, which was another type
>>>>> for which a JSON writer wasn't defined in my case.
>>>>>
>>>>> For org.postgresql.jdbc4.**Jdbc4Array however, there's something
>>>>> missing, because I get:
>>>>>
>>>>> *org.postgresql.util.PSQLException: This connection has been
>>>>> closed.*
>>>>>
>>>>> As the person answering me on Stack Overflow suggested, it seems that
>>>>> the resultset should be somehow processed before the connection is
>>>>> closed,
>>>>> but I really don't know how to do given the construct I'm currently using:
>>>>>
>>>>> (json/write-str
>>>>> (jdbc/query *db*
>>>>> ["SELECT * FROM .."]))
>>>>>
>>>>> where and how could I intercept the resultset that way? Thanks.
>>>>>
>>>>>
>>>>>
>>>>> On Tuesday, October 1, 2013 12:49:10 PM UTC-4, r0man wrote:
>>>>>>
>>>>>> I think you need to implement the JSONWriter protocol for the
>>>>>> Jdbc4Array class, and possibly for the datatypes that are in the
>>>>>> array. This for example makes the json library aware of
>>>>>> java.util.Date classes.
>>>>>>
>>>>>> (extend-type java.util.Date
>>>>>> JSONWriter
>>>>>> (-write [date out]
>>>>>> (-write (str date) out)))
>>>>>>
>>>>>> Something like this (not tested):
>>>>>>
>>>>>> (extend-type org.postgresql.jdbc4.**Jdbc4Arra**y
>>>>>> JSONWriter
>>>>>> (-write [array out]
>>>>>> (-write (seq (.getArray array)) out)))
>>>>>>
>>>>>> Roman
>>>>>>
>>>>>>
>>>>>> On Tuesday, October 1, 2013 3:57:02 PM UTC+2, Christian Jauvin wrote:
>>>>>>>
>>>>>>> Hi,
>>>>>>>
>>>>>>> I asked this question on Stack Overflow yesterday:
>>>>>>>
>>>>>>> I want to jsonify the results of a query performed against a
>>>>>>> Postgres table containing a column of type text[], but the problem
>>>>>>> is that clojure.data.json.write-str doesn't seem to know how to
>>>>>>> handle PG arrays:
>>>>>>>
>>>>>>> *Exception Don't know how to write JSON of class
>>>>>>> org.postgresql.jdbc4.Jdbc4Array clojure.data.json/write-generic*
>>>>>>>
>>>>>>> Do I have to supply a custom handler, or is there a simpler way?
>>>>>>>
>>>>>>>
>>>>>>> http://stackoverflow.com/**quest**ions/19103870/jsonify-a-**jdbc4a**
>>>>>>> rray-in-clojure<http://stackoverflow.com/questions/19103870/jsonify-a-jdbc4array-in-clojure>
>>>>>>>
>>>>>>> I'm asking it here in the hope of getting (maybe) a simpler
>>>>>>> solution, or at least one I can implement readily, because the problem
>>>>>>> I
>>>>>>> have with one of the suggestions I received (extending
>>>>>>> org.postgresql.jdbc4.**Jdbc4Arra**y to implement the missing
>>>>>>> function) is that I don't know how to make it work with my usage
>>>>>>> pattern,
>>>>>>> which is simply:
>>>>>>>
>>>>>>> (json/write-str
>>>>>>> (jdbc/query *db*
>>>>>>> ["SELECT * FROM ..."]))
>>>>>>>
>>>>>>> How do I "get the array before the connection is closed" with such a
>>>>>>> construct? Is there another way?
>>>>>>>
>>>>>>> --
>>>>> --
>>>>> You received this message because you are subscribed to the Google
>>>>> Groups "Clojure" group.
>>>>> To post to this group, send email to [email protected]
>>>>>
>>>>> Note that posts from new members are moderated - please be patient
>>>>> with your first post.
>>>>> To unsubscribe from this group, send email to
>>>>> clojure+u...@**googlegroups.com
>>>>>
>>>>> For more options, visit this group at
>>>>> http://groups.google.com/**group/clojure?hl=en<http://groups.google.com/group/clojure?hl=en>
>>>>> ---
>>>>> You received this message because you are subscribed to the Google
>>>>> Groups "Clojure" group.
>>>>> To unsubscribe from this group and stop receiving emails from it, send
>>>>> an email to clojure+u...@**googlegroups.com.
>>>>>
>>>>> For more options, visit
>>>>> https://groups.google.com/**groups/opt_out<https://groups.google.com/groups/opt_out>
>>>>> .
>>>>>
>>>>
>>>>
>>>>
>>>> --
>>>> Philippe
>>>>
>>> --
>>> --
>>> You received this message because you are subscribed to the Google
>>> Groups "Clojure" group.
>>> To post to this group, send email to [email protected]
>>> Note that posts from new members are moderated - please be patient with
>>> your first post.
>>> To unsubscribe from this group, send email to
>>> [email protected]
>>> For more options, visit this group at
>>> http://groups.google.com/group/clojure?hl=en
>>> ---
>>> You received this message because you are subscribed to the Google
>>> Groups "Clojure" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to [email protected].
>>> For more options, visit https://groups.google.com/groups/opt_out.
>>>
>>
>>
>>
>> --
>> http://elhumidor.blogspot.com/
>>
>
--
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
---
You received this message because you are subscribed to the Google Groups
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.