Handling database queries with different libraries. Support for yesql, honeysql, sequentials (string + params) and plain strings.
yesql is nice when I know the query beforehand. Honey SQL is nice when I don't. Just a plain string with some args is sometimes the best option. And sometimes I really want to just send in a vector that's been reduced.
(defprotocol IEzDatabase
(query [database query] [database key? query] [database key query args])
(query! [database query] [database key? query] [database key query args])
(query<! [database query] [database key? query] [database key query args])
(databases [database]))
- database which is a record is always the first field.
- query always returns a result set.
- query! executes a command and does not return a result set.
- query<! executes a command and gives back a value. Used for insert
Download from clojars
[ez-database "0.3.0"]
Assuming a database with the following schema.
CREATE TABLE test (
id integer
);
INSERT INTO test VALUES (0), (42);
(require '[ez-database.core :as db])
(def db-spec {:classname "org.postgresql.Driver"
:subprotocol "postgresql"
:subname "//localhost:5432/test"
:user "user"
:password "password"}})
;; add extra database specs under different keys
;; default is a required key
(def db (db/map->EzDatabase {:db-specs {:default db-spec}}))
Given above code...
(db/query db "select * from test;") ;; => [{:id 0} {:id 42}]
(db/query db "select * from test where id > ?" [0]) ;; => [{:id 42}]
(db/query db ["select * from test where id > ?" 0]) ;; => [{:id 42}]
--name: sql-select-query
SELECT * FROM test WHERE id > :id;
(db/query db sql-select-query {:id 0});; => [{:id 42}]
(db/query db {:select [:*]
:from [:test]
:where [:> :id 0]}) ;; => [{:id 42}]
(db/query! db "delete from test;")
(db/query! db "delete from test where id > ?;" [0])
(db/query! db ["delete from test where id > ?;" 0])
(db/query! db ["delete from test where id > ?;"] [0])
--name: sql-delete-higher-than!
DELETE FROM test WHERE id > :id;
(db/query! db sql-delete-higher-than! {:id 0})
(db/query! db {:delete-from :test
:where [:> :id 0]})
;; return scalar value
(db/query<! db "insert into test values (-1);") ;; => [1]
;; return value
(db/query<! db "test" [{:id -1}]) ;; => [{:id -1}]
;; return scalar value
(db/query<! db ["insert into test values (?);" -1]) ;; => [1]
--name: sql-insert<!
INSERT INTO test VALUES (:id);
Note that yesql functions returns the actual value, not a sequence of values.
(db/query<! db sql-insert<! {:id -1}) ;; => {:id -1}
(db/query<! db {:insert-into :test
:values [{:id -1}]}) ;; => [{:id -1}]
Returns a list of keys for the databases in the record.
(db/database db) ;; => (:default)
Assuming databases :default and :foobar we can do selects against both of them.
(require '[ez-database.core :as db])
(def db-spec {:classname "org.postgresql.Driver"
:subprotocol "postgresql"
:subname "//localhost:5432/test"
:user "user"
:password "password"}})
(def db-spec-foo {:classname "org.postgresql.Driver"
:subprotocol "postgresql"
:subname "//localhost:5432/foobar"
:user "user"
:password "password"}})
;; add extra database specs under different keys
;; default is a required key
(def db (db/map->EzDatabase {:db-specs {:default db-spec
:foobar db-spec-foo}}))
(db/query db "select * from test;") ;; => [{:id 0} {:id 42}]
(db/query db :foobar "select * from foo where id > ?" [0]) ;; => [{:id 42 :what_p "How many bars does it take for foo to be happy?"}]
No good support for rollbacks yet.
Copyright © 2015 Emil Bengtsson
Distributed under the Eclipse Public License either version 1.0 or (at your option) any later version.
Coram Deo