我试着用java.jdbc插入!功能,可以接收多个对象。
应该像这样调用clojure.java.jdbc/insert!
:
(clojure.java.jdbc/insert! db {:name "john" :password "123"} {:name "george" :password "234"})
我定义了一个添加多个用户记录的函数:
(defn add-users [user & more]
(-add-users db-spec user more))
(defmacro -add-users
([db user] `(j/with-db-connection [con-db# db]
(j/insert! con-db# ~user)))
([db user & more] (let [users (-mk-user-list user more)]
`(j/with-db-connection [con-db# db]
(j/insert! con-db# ~@(flatten users)))))
(defmacro -mk-usre-list
([user] `~user)
([user & more] `(list ~user (-mk-user-list ~@more))))
当我宏 - 扩展-add-users时,看起来结果是这样的:
=> (macroexpand '(-add-users db-spec {:name "john" :password "1234"}))
(let* [db-spec__21320__auto__ db-spec] (clojure.core/with-open [con__21321__auto__ (clojure.java.jdbc/get-connection db-spec__21320__auto__)] (clojure.core/let [con-db__23557__auto__ (clojure.java.jdbc/add-connection db-spec__21320__auto__ con__21321__auto__)] (clojure.java.jdbc/insert! con-db__23557__auto__ {:name "john", :password "1234"}))))
但是当我跑步时:
=> (add-users {:name "john" :password "1234"})
IllegalArgumentException insert called with columns but no values clojure.java.jdbc/insert-sql (jdbc.clj:992)
这个宏有什么问题?或者我应该如何包装并传递任何数量的参数来运行像insert!
那样需要展平的参数?
[更新] 找到问题: 插入!需要表,而在代码中它不存在。
(j / insert!con-db#~user)应该是(j / insert!con-db#:users~user) (j / insert!con-db#〜@(flatten users))应该是(j / insert!con-db#:users~ @(flatten users))
但无论如何更难做到吗?
答案 0 :(得分:2)
您可以使用apply:
在没有宏的情况下解决此问题user=> (doc apply)
-------------------------
clojure.core/apply
([f args] [f x args] [f x y args] [f x y z args] [f a b c d & args])
Applies fn f to the argument list formed by prepending intervening arguments to args.
(defn my-insert! [x & more]
(apply jdbc/insert! db :table x more))
答案 1 :(得分:0)
在clojure.java.jdbc
的最新版本中,您可以使用insert-multi!
接受行的哈希映射序列:
(defn my-insert! [& more]
(jdbc/insert-multi! db-spec :table more))
或者您可以这样做:
(jdbc/insert-multi! db-spec :table [user-1 user-2 user-3])