Query for data in the Clojure world

Being an ecosystem that emphasizes simplicity, the Clojure world has most of its SQL libraries follow a pattern of querying for data:

(execute-query database-instance the-query)

for instance, this is how to do it with plain clojure.java.jdbc:

(clojure.java.jdbc/query {:connection-uri "postgresql://..."}
  ["select * from fruit where appearance = ?" "rosy"])

A strange SQL library

Walkable is no ordinary SQL library but one for building APIs. Each element of the said pattern has evolved into rather a comprehensive counterpart:

  • execute-query is still a function, but no longer a generic one, but one that is specific to your project. You generate such functions by providing the neccessary information. The most important piece of this information is called the registry.

  • query now uses EQL format so it can describe complex, nested structures. It is expected to be sent from untrusted environments (ie remote client over the internet)

  • database-instance alone is not sufficient to derive the result, for instance you may need to provide current user’s id (for authentication/authorization purpose). Therefore, database-instance is replaced with a hash-map of relevant data called the env.

To sum up:

(let [execute-query (make-execute-function ...) (1)
      env {:db database-instance (2)
           :user-id some-id
           :other-stuff ...}]
  (execute-query env eql-query))
;; => result
1 how to build the execute-query function will be covered in installation page.
2 the key in env can be anything, you can even have different keys for different databases, eg {:redis some-instance :sqlite other-instance :postgres another :datomic ...}.