honeysql/README.md

62 lines
1.7 KiB
Markdown
Raw Normal View History

# Honey SQL
2012-07-13 13:57:47 +00:00
SQL as Clojure data structures.
**Work in progress**
## Usage
2012-07-13 13:57:47 +00:00
```clj
(require '[honeysql.core :refer [format-sql sql merge-sql sql-fn sql-raw]])
;; Everything is centered around maps representing SQL queries
(def sqlmap {:select [:a :b :c]
:from [:foo]
:where [:= :f.a "baz"]})
;; format-sql turns maps into clojure.java.jdbc-compatible, parameterized SQL
(format-sql sqlmap)
=> ["SELECT a, b, c FROM foo WHERE (f.a = ?)" ["baz"]]
;; The sql function is a helper for building query maps
(= sqlmap
(sql :select [:a :b :c]
:from :foo
:where [:= :f.a "baz"]))
=> true
;; Providing a map as the first argument to sql will use that map as a base,
;; with the new clauses replacing old ones
(format-sql (sql sqlmap :select :* :limit 10))
=> ["SELECT * FROM foo WHERE (f.a = ?) LIMIT 10" ["baz"]]
;; To add to clauses instead of replacing them, use merge-sql
(format-sql
(merge-sql sqlmap :select [:d :e] :where [:> :b 10]))
=> ["SELECT a, b, c, d, e FROM foo WHERE ((f.a = ?) AND (b > 10))" ["baz"]]
;; Queries can be nested
(format-sql
(sql :select :*
:from :foo
:where [:in :foo.a (sql :select :a
:from :bar)]))
=> ["SELECT * FROM foo WHERE (foo.a IN (SELECT a FROM bar))"]
;; There are helper functions and data literals for handling SQL function
;; calls and raw SQL fragments
(sql :select [(sql-fn :count :*) (sql-raw "@var := foo.bar")]
:from :foo)
=> {:from (:foo), :select (#sql/fn [:count :*] #sql/raw "@var := foo.bar")}
(format-sql *1)
=> ["SELECT COUNT(*), @var := foo.bar FROM foo"]
```
## License
Copyright © 2012 Justin Kramer
Distributed under the Eclipse Public License, the same as Clojure.