As I promised, I created an open source library for this stuff:
https://github.com/netizer/relational_mapper

More info here: 
https://groups.google.com/forum/#!searchin/clojure/krzysiek/clojure/g6Yxk-o6_rQ/uo9IVN20CAAJ

Enjoy :-)
Krzysiek Heród

On Tuesday, May 26, 2015 at 4:43:18 AM UTC+8, Krzysiek Herod wrote:
>
> Thanks Daniel, and Sean for your answers. 
>
> Daniel, the part that interests me the most is "converting resultset rows 
> to collection (of objects)", and I think a lot of people do just what you 
> said (own customized function). I was looking for, and will probably in the 
> end implement an open source library that does exactly that in some 
> standardized way. 
>
> Sean, maybe my use case is specific to web applications. In REST API's 
> it's common to respond with something like "Example Result" here: 
> https://dev.twitter.com/rest/reference/get/statuses/mentions_timeline I 
> completely agree with you about ORMs, but in case of REST API's one just 
> needs to somehow map the queryset to a structure of hashes and arrays (not 
> necessarily objects), and this task is much heavier than I thought in the 
> beginning, from choosing between making many queries to fill in the hash of 
> related objects vs making JOINs, to complexity of extracting data from a 
> set of rows with potential repetitions, rows of null values (like Daniel 
> said happens for instance in case of LEFT JOINS), and different kinds of 
> relations (has-one, has-many, belongs-to). 
>
> I just thought that maybe a tool for that (relational mapper - but not 
> "object-" like it's common in Java, and Ruby, but just hashes and arrays) 
> already exists, but if not, I'll implement it and open source it soonish. 
> BTW, if there are here developers that would be interested in such tool, 
> let me know what data format and a set of features would you find the most 
> desirable. 
>
>
>
> W dniu poniedziałek, 25 maja 2015 19:13:10 UTC+2 użytkownik Sean Corfield 
> napisał:
>>
>> I just don’t consider it a problem. A query returns a flat result set — a 
>> sequence of hash-maps. That’s it. That’s what SQL returns (essentially a 
>> table) and it’s a perfectly reasonable data structure for Clojure to work 
>> with.
>>
>> The JOINs in SQL just say how to link tables together to produce that 
>> (flat) result set. Any structural grouping semantics you want to apply are 
>> up to your application.
>>
>> FWIW, I find ORMs — which is where you’re going with this — to be far 
>> more trouble than they’re worth and I just don’t see the benefit in Clojure 
>> which is all about pure data structures. I worked with a lot of ORMs — and 
>> written several of my own — over the last couple of decades and these days 
>> I just avoid them.
>>
>> Sean
>>
>> On May 24, 2015, at 3:10 AM, Krzysiek Herod <krzysie...@gmail.com> wrote:
>>
>> It seems to me that it's a problem that sooner or later appears in any 
>> project using relational database (apart form easy cases, when there is no 
>> many relations between tables). Am I missing something? How do you guys 
>> work with database results of queries containing several tables referring 
>> to each other? 
>>
>> W dniu czwartek, 21 maja 2015 21:57:03 UTC+2 użytkownik Krzysiek Herod 
>> napisał:
>>>
>>> I've found the question appearing here, but a long time ago, so I 
>>> thought that maybe the situation changed:
>>>
>>> Is there a relational mapper in clojure (or in java) that takes query 
>>> result and generates an array of hashmaps?
>>> I mean something that converts the result of this query:
>>> "SELECT * FROM posts LEFT JOIN comments ON (comments.post_id = posts.id) 
>>> LEFT JOIN users ON (posts.user_id = users.id)"
>>> into (for example) the following structure:
>>> [{:title "Post title" :user {:first_name "User 1"} :comments [{:title 
>>> "Comment 1"} {:title "Comment 2"}]}]
>>>
>>> I've used kormadb for that, but it works like this only with has-many 
>>> relation (belongs-to puts all of the fields from related tables into the 
>>> same hash as if it was one table, and using "with" do not solve the problem 
>>> neither).
>>>
>>> Is there any other clojure library that does that, or is any java 
>>> library used instead?  
>>>
>>
>>
>>

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
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 clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to