/ / Jak wykonać zapytanie o aktualizację wsadową SQL w Clojure? - jdbc, clojure

Jak wykonać wsadowe zapytanie o aktualizację SQL w Clojure? - jdbc, clojure

Jak wykonać następujące zapytanie dla tysięcy wierszy jako pojedynczego wywołania wsadowego przy użyciu przygotowanej instrukcji pod maską?

(clojure.java.jdbc/execute! db ["UPDATE person SET zip = ? WHERE zip = ?" 94540 94546])

Robi clojure / jdbc ma odpowiednią funkcję lub coś innego?

Odpowiedzi:

1 dla odpowiedzi № 1

Znalazłem odpowiedź. Odpowiednia funkcja to clojure.java.jdbc/db-do-prepared z włączoną :multi? klawisz.

(clojure.java.jdbc/db-do-prepared db
["UPDATE person SET zip = ? WHERE zip = ?"
[94540 94546]
[94541 94547]
...
]
{:multi? true})

0 dla odpowiedzi nr 2

Oto sposób, w jaki zrobiłem to dla jednego z moich projektów:

(require "[clojure.java.jdbc :as sql])


(defn- db-do-cmd
[command]
(sql/db-do-commands @db-url command))


(defn- create-update-phone-sql
[{:keys [fname lname dob phone]}]
(let [where-init (format "UPDATE person SET phone = %s WHERE " (escape-quote-and-null phone))
where-rest (apply str (interpose " AND " [(str "person.dob" (escape-quote-and-null-for-where dob))
(str "person.fname" (escape-quote-and-null-for-where fname))
(str "person.lname" (escape-quote-and-null-for-where lname))]))]
(str where-init where-rest)))


(defn batch-update!
[coll]
(db-do-cmd (map create-update-phone-sql coll)))