我需要能够在clojure中加载并执行包含多个SQL语句的文件。例如,假设我有一个包含以下语句的文件:
ALTER TABLE bla...;
ALTER TABLE foo...;
UPDATE bla SET ...;
UPDATE foo SET ...;
ALTER TABLE bla DROP...;
ALTER TABLE foo DROP...;
你明白了 - 一个包含许多以分号结尾的语句的文件。
我在尝试使用do-commands
时遇到以下错误:
PSQLException org.postgresql.util.PSQLException: Too many update results were returned.
答案 0 :(得分:4)
我最终解决这个问题的方式是这样的:
(ns myns.db
(:require [clojure.java.jdbc :as sql]
[clojure.java.io :refer [resource]]))
(defn db-conn [] ...)
(defn exec-sql-file
[file]
(sql/with-connection (db-conn)
(sql/do-prepared
(slurp (resource file)))))
...
; from your lein project where src/sql/some-statements.sql is the file you want to load
(exec-sql-file "sql/some-statements.sql")
我很想知道别人如何处理这个问题。还有更好的方法吗?
答案 1 :(得分:0)
我正在使用[org.clojure/java.jdbc "0.7.9"]
。接受的答案对我不起作用。这就是我实现同样壮举的方式:
我的文件内容:
["insert into user (email , password, name, type) values ('carlos@myshoppingapp.com', 'password', 'Carlos Frank', 'admin')"
"insert into user (email , password, name, type) values ('alice@gmail.com', 'password', 'Alice Williams', 'customer')"
"insert into user (email , password, name, type) values ('piyush@gmail.com', 'password', 'Piyush Goyal', 'customer')"]
请注意,整个文件内容都包含在一个向量内,并且每个sql都用双引号引起来。
读取此文件并填充DB的代码:
(defn exec-sql-file
[file]
(jdbc/db-do-commands db-spec (read-string (slurp file))))