; easier reloads at the repl
(defn setup-queries []
(if-not (nil? *db*)
(conman/disconnect! *db*))
(conman/bind-connection *db* "sql/queries.sql"))
; make sure we actually load it!
(setup-queries)
Then just call (setup-queries) at the repl whenever you need to refresh your queries.
(defmacro bind-connection [ns conn & filenames]
(let [options? (map? (first filenames))
options (if options? (first filenames) {})
filenames (if options? (rest filenames) filenames)]
`(let [{snips# :snips fns# :fns :as queries#} (conman.core/load-queries '~filenames ~options)]
(doseq [[id# {fn# :fn {doc# :doc} :meta}] snips#]
(intern ~ns (with-meta (symbol (name id#)) {:doc doc#}) fn#))
(doseq [[id# {fn# :fn {doc# :doc} :meta}] fns#]
(intern ~ns (with-meta (symbol (name id#)) {:doc doc#})
(fn
([] (fn# ~conn {}))
([params#] (fn# ~conn params#))
([conn# params#] (fn# conn# params#))
([conn# params# opts# & command-opts#]
(apply fn# conn# params# opts# command-opts#)))))
queries#)))(def ^:dynamic *db*)
(defstate conn
:start (do
(alter-var-root
#'*db*
(constantly
(conman/connect! {:jdbc-url (env :database-url)})))
(bind-connection 'my-namespace *db* "sql/queries.sql"))
:stop (conman/disconnect! *db*))
(alter-var-root #'*db* conman/connect! {:jdbc-url (env :database-url)})(bind-connection'my-namespace/*db*"sql/queries.sql")(defstate queries :start (conman/bind-connection *db* "queries.sql"))
(defn query [id & args] (if-let [query (or (-> queries :fns id) (-> queries :snips id))] (apply query args) (throw (Exception. (str "query " id " not found") {:cause {:missing}}))))Agree on both counts
(defstate queries :start (load-queries ["queries.sql"]))
(db-command conn
queries
:add-fruit!
{:name "banana"
:appearance "banana"
:cost 1
:grade 1})
(query conn
queries
:get-fruit-by
{:by-appearance
(snippet queries :by-appearance {:appearance "banana"})})
Agree on both counts
(defstate queries :start (if (:dev env) (conman/bind-connection *db* "queries-dev.sql") (conman/bind-connection *db* "queries-prod.sql")))