按照以下链接http://clojure.github.io/java.jdbc/#clojure.java.jdbc/insert!
此函数的参数为
(insert! db-spec table col-name-vec col-val-vec & col-val-vecs :transaction? true :entities identity)
因此它接受多个向量作为多行插入。
但是如果我有一个向量列表,以及如何将它传递给这个函数?
(def rows (repeat 10 [ 1 2]))
(clojure.jdbc/insert mydb test_table [:a :b] rows) ;; this doesn't work as rows is a list of vector
;; I could use map to insert one by one but that's slow,
;; so how to convert rows into multiple vector?
;;I am think of apply function but don't know how to use it here.
答案 0 :(得分:1)
我认为你想使用apply
:
(def rows (repeat 10 [ 1 2]))
(apply clojure.jdbc/insert! mydb test_table [:a :b] rows)
通常,如果您的集合包含要作为参数传递给函数的值,则apply
非常有用。
答案 1 :(得分:0)
已经建议的apply解决方案是在函数调用中将值列表分解为参数的标准方法。
但是,如果性能是您主要关注的问题,那么配置jdbc以使用连接池并确保您的事务具有正确的粒度级别非常重要。
我发现在github上的java.jdbc存储库中进行测试非常有用。如果您想更熟悉如何使用库,强烈推荐它。
最后,根据您使用的后端数据库(和底层jdbc连接器),也可能存在显着差异。在某些情况下,可能需要查看java.jdbc实现代码以及驱动程序功能,以了解clojure jdbc函数如何映射到底层jdbc驱动程序。这可以为您提供有关如何最好地调用java.jdbc clojure函数的明确想法。当我想将这个库与Oracle数据库和调用存储过程一起使用时,我发现这个有用。当然,不是一个推荐的事情,因为你做了非常脆弱的代码(虽然这种方法最初解决了我的问题,库继续前进,因为我的代码不礼貌,它打破了 - 这是可以的,因为我只需要这个级别的功能短期)。