Merge pull request #217 from jkk/MichaelBlume-delete
Add multi-table DELETE that takes a FROM clause
This commit is contained in:
commit
71d7ced0a0
4 changed files with 41 additions and 0 deletions
16
README.md
16
README.md
|
|
@ -204,6 +204,22 @@ Deletes look as you would expect:
|
||||||
=> ["DELETE FROM films WHERE kind <> ?" "musical"]
|
=> ["DELETE FROM films WHERE kind <> ?" "musical"]
|
||||||
```
|
```
|
||||||
|
|
||||||
|
If your database supports it, you can also delete from multiple tables:
|
||||||
|
|
||||||
|
```clojure
|
||||||
|
(-> (delete [:films :directors])
|
||||||
|
(from :films)
|
||||||
|
(join :directors [:= :films.director_id :directors.id])
|
||||||
|
(where [:<> :kind "musical"])
|
||||||
|
sql/format)
|
||||||
|
=> [#sql/regularize
|
||||||
|
"DELETE films, directors
|
||||||
|
FROM films
|
||||||
|
INNER JOIN directors ON films.director_id = directors.id
|
||||||
|
WHERE kind <> ?"
|
||||||
|
"musical"]
|
||||||
|
```
|
||||||
|
|
||||||
Queries can be nested:
|
Queries can be nested:
|
||||||
|
|
||||||
```clojure
|
```clojure
|
||||||
|
|
|
||||||
|
|
@ -205,6 +205,7 @@
|
||||||
:select 50
|
:select 50
|
||||||
:insert-into 60
|
:insert-into 60
|
||||||
:update 70
|
:update 70
|
||||||
|
:delete 75
|
||||||
:delete-from 80
|
:delete-from 80
|
||||||
:columns 90
|
:columns 90
|
||||||
:from 110
|
:from 110
|
||||||
|
|
@ -588,6 +589,9 @@
|
||||||
(defmethod format-clause :delete-from [[_ table] _]
|
(defmethod format-clause :delete-from [[_ table] _]
|
||||||
(str "DELETE FROM " (to-sql table)))
|
(str "DELETE FROM " (to-sql table)))
|
||||||
|
|
||||||
|
(defmethod format-clause :delete [[_ tables] _]
|
||||||
|
(str "DELETE " (comma-join (map to-sql tables))))
|
||||||
|
|
||||||
(defn cte->sql
|
(defn cte->sql
|
||||||
[[cte-name query]]
|
[[cte-name query]]
|
||||||
(str (binding [*subquery?* false]
|
(str (binding [*subquery?* false]
|
||||||
|
|
|
||||||
|
|
@ -271,6 +271,13 @@
|
||||||
([table] (delete-from nil table))
|
([table] (delete-from nil table))
|
||||||
([m table] (build-clause :delete-from m table)))
|
([m table] (build-clause :delete-from m table)))
|
||||||
|
|
||||||
|
(defmethod build-clause :delete [_ m tables]
|
||||||
|
(assoc m :delete tables))
|
||||||
|
|
||||||
|
(defn delete
|
||||||
|
([tables] (delete nil tables))
|
||||||
|
([m tables] (build-clause :delete m tables)))
|
||||||
|
|
||||||
(macros/usetime
|
(macros/usetime
|
||||||
(defhelper with [m ctes]
|
(defhelper with [m ctes]
|
||||||
(assoc m :with ctes)))
|
(assoc m :with ctes)))
|
||||||
|
|
|
||||||
|
|
@ -200,3 +200,17 @@
|
||||||
:set {:a 1}
|
:set {:a 1}
|
||||||
:where [:= :bar.b 42]}
|
:where [:= :bar.b 42]}
|
||||||
(format :quoting :mysql)))))
|
(format :quoting :mysql)))))
|
||||||
|
|
||||||
|
(deftest delete-from-test
|
||||||
|
(is (= ["DELETE FROM `foo` WHERE `foo`.`id` = ?" 42]
|
||||||
|
(-> {:delete-from :foo
|
||||||
|
:where [:= :foo.id 42]}
|
||||||
|
(format :quoting :mysql)))))
|
||||||
|
|
||||||
|
(deftest delete-test
|
||||||
|
(is (= ["DELETE `t1`, `t2` FROM `table1` `t1` INNER JOIN `table2` `t2` ON `t1`.`fk` = `t2`.`id` WHERE `t1`.`bar` = ?" 42]
|
||||||
|
(-> {:delete [:t1 :t2]
|
||||||
|
:from [[:table1 :t1]]
|
||||||
|
:join [[:table2 :t2] [:= :t1.fk :t2.id]]
|
||||||
|
:where [:= :t1.bar 42]}
|
||||||
|
(format :quoting :mysql)))))
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue