Merge pull request #9 from doffltmiw/master

add support for insert, update and delete queries
This commit is contained in:
Justin Kramer 2013-12-13 08:23:00 -08:00
commit 5aa351ab48
3 changed files with 94 additions and 3 deletions

View file

@ -42,7 +42,14 @@
:having, :merge-having
:limit
:offset
:modifiers, :merge-modifiers"
:modifiers, :merge-modifiers
:insert-into
:columns, :merge-columns
:values, :merge-values
:query-values
:update
:set
:delete-from"
[& clauses]
(let [[base clauses] (if (map? (first clauses))
[(first clauses) (rest clauses)]

View file

@ -152,8 +152,9 @@
(def clause-order
"Determines the order that clauses will be placed within generated SQL"
[:select :from :join :left-join :right-join :where :group-by :having
:order-by :limit :offset])
[:select :insert-into :update :delete-from :columns :set :from :join
:left-join :right-join :where :group-by :having :order-by :limit :offset
:values :query-values])
(def known-clauses (set clause-order))
@ -342,3 +343,31 @@
(defmethod format-clause :offset [[_ offset] _]
(str "OFFSET " (to-sql offset)))
(defmethod format-clause :insert-into [[_ table] _]
(str "INSERT INTO " (to-sql table)))
(defmethod format-clause :columns [[_ fields] _]
(str "(" (comma-join (map to-sql fields)) ")"))
(defmethod format-clause :values [[_ values] _]
(if (sequential? (first values))
(str "VALUES " (comma-join (for [x values]
(str "(" (comma-join (map to-sql x)) ")"))))
(str
"(" (comma-join (map to-sql (keys (first values)))) ") VALUES "
(comma-join (for [x values]
(str "(" (comma-join (map to-sql (vals x))) ")"))))))
(defmethod format-clause :query-values [[_ query-values] _]
(to-sql query-values))
(defmethod format-clause :update [[_ table] _]
(str "UPDATE " (to-sql table)))
(defmethod format-clause :set [[_ values] _]
(str "SET " (comma-join (for [[k v] values]
(str (to-sql k) " = " (to-sql v))))))
(defmethod format-clause :delete-from [[_ table] _]
(str "DELETE FROM " (to-sql table)))

View file

@ -154,3 +154,58 @@
m
(update-in m [:modifiers] concat (collify ms))))
(defmethod build-clause :insert-into [_ m table]
(assoc m :insert-into table))
(defn insert-into
([table] (insert-into nil table))
([m table] (build-clause :insert-into m table)))
(defhelper columns [m fields]
(assoc m :columns (collify fields)))
(defhelper merge-columns [m fields]
(update-in m [:columns] concat (collify fields)))
(defmethod build-clause :values [_ m vs]
(assoc m :values vs))
(defn values
([vs] (values nil vs))
([m vs] (build-clause :values m vs)))
(defmethod build-clause :merge-values [_ m vs]
(update-in m [:values] concat vs))
(defn merge-values
([vs] (merge-values nil vs))
([m vs] (build-clause :merge-values m vs)))
(defmethod build-clause :query-values [_ m vs]
(assoc m :query-values vs))
(defn query-values
([vs] (values nil vs))
([m vs] (build-clause :query-values m vs)))
(defmethod build-clause :update [_ m table]
(assoc m :update table))
(defn update
([table] (update nil table))
([m table] (build-clause :update m table)))
(defmethod build-clause :set [_ m values]
(assoc m :set values))
;; short for sql set, to avoid name collision with clojure.core/set
(defn sset
([vs] (values nil vs))
([m vs] (build-clause :set m vs)))
(defmethod build-clause :delete-from [_ m table]
(assoc m :delete-from table))
(defn delete-from
([table] (delete-from nil table))
([m table] (build-clause :delete-from m table)))