# clojure-sql A DSL for [Clojure][1] to compose queries using the constructs of [Relational Algebra][2]. The RA constructs are then compiled into an SQL query to be run on a DBMS. `clojure-sql` doesn't connect to a database itself, but rather can be configured to perform an action when a query is to be executed. `clojure-sql` provides some utility functions beyond strict RA to allow for data to be inserted, updated and deleted. `clojure-sql` provides no mechanism to create database schemas. [1]: http://clojure.org/ [2]: http://en.wikipedia.org/wiki/Relational_Algebra ## Database support `clojure-sql` aims to have an extensible compiler. Compilation of queries is performed by multimethods which dispatch on an arbitrary (and otherwise unused) `db` parameter. This allows the compilation of queries to be entirely special-cased per database. By default `clojure-sql` will produce SQL for PostgreSQL. ## Usage (require '[clojure-sql.core :as s]) (-> (s/table :users) ;; tables are automatically given internal aliases (s/project [:id :username])) ; => ["SELECT \"users1234\".\"id\", \"users1234\".\"username\" FROM \"users\" AS \"users1234\""] (-> (s/table :users) (s/project [:id :username]) (s/rename {:id :uid}) (s/join (-> (s/table :people) (s/project {:id :pid, :fname :first}) (s/select '(= :first "Henry"))) '(= :uid :pid)) (s/project [:username])) ; => ["SELECT \"users1234\".\"username\" FROM \"users\" AS \"users1234\" JOIN \"people\" AS \"people1234\" ON (\"users1234\".\"id\" = \"people1234\".\"id\") WHERE (\"people1234\".\"fname\" = ?)" "Henry")] [clojure.java.jdbc][3] support is provided, but must be included explicitly. (require '[clojure-sql.jdbc :as jdbc]) (jdbc/use-jdbc! "postgres://user:pass@localhost:5432/db") ; => nil (deref (-> (s/table :users) (s/project [:id :username]))) ; => [{:id 5, :username "mange"}] Results are returned from queries in an eager vector. [3]: https://github.com/clojure/java.jdbc ## License Copyright © 2013 Carlo Zancanaro Distributed under the Eclipse Public License, the same as Clojure.