Other than the fact that this approach doesn't reach the level of functional purity that some people want, after playing with it for a while, we found it very productive and leads to clean/readable code and tests, so we decided to turn it into a library:
https://clojars.org/conman https://github.com/luminus-framework/conman You are still in control of the connection so you can do other things with it and have more than one if necessary. On 31 July 2015 at 01:44, J. Pablo Fernández <pup...@pupeno.com> wrote: > Hello Clojurians, > > I found passing around the database connection to each function that uses > it very error prone when you are using transactions as passing the wrong > one could mean a query runs outside the transaction when in the source code > it is inside the with-db-transaction function. So I ended up defining the > db namespace like this: > > (ns db) > > (defonce ^:dynamic conn (atom nil)) > > (defn connect! > (reset conn (generate-new-connection))) > > (defn run-query > [query] (run-query query @conn) > [query conn] (run-the-query-in-connection query conn)) > > > This is pseudo-code of course, simplified to highlight the part that I'm > most unfamiliar with: > > (defonce ^:dynamic conn (atom nil)) > > The reason why it's an atom is so that connect! can *set* it and the > reason why it's a dynamic var is so I can do this: > > (jdbc/with-db-transaction > [db-connection-with-transaction @db/conn] > (binding [db/conn (atom db-connection-with-transaction)] > (db/run-query "SELECT *")))))) > > and the query will be implicitly run inside the transaction. Does it make > sense? Is this wrong? will it fail in unexpected ways? Is there a better > way? > > Thanks. > > > -- > 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 a topic in the > Google Groups "Clojure" group. > To unsubscribe from this topic, visit > https://groups.google.com/d/topic/clojure/fRi554wbPSk/unsubscribe. > To unsubscribe from this group and all its topics, send an email to > clojure+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/d/optout. > -- J. Pablo Fernández <pup...@pupeno.com> (http://pupeno.com) -- 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.