【问题标题】:How to execute batch SQL update query in Clojure?如何在 Clojure 中执行批量 SQL 更新查询?
【发布时间】:2018-09-11 20:45:05
【问题描述】:

如何在后台使用准备好的语句以单个批处理调用的形式对千行执行以下查询?

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

clojure/jdbc 是否有相应的功能或其他功能?

【问题讨论】:

  • 您可以使用 [clojure.java.jdbc :as sql] 中的 sql/db-do-commands

标签: jdbc clojure


【解决方案1】:

找到答案。适用的功能是clojure.java.jdbc/db-do-prepared,启用:multi?键。

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

【讨论】:

  • 非常感谢您!文档中没有这样的例子,但这对我有帮助。
  • 同样的语法也可以用于execute!
【解决方案2】:

这是我为我的一个项目做的方式:

(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)))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-05
    • 1970-01-01
    • 1970-01-01
    • 2011-01-08
    • 2022-07-12
    相关资源
    最近更新 更多