如何将矢量列表传递给clojure.jdbc / insert!在关闭

时间:2015-01-06 13:51:07

标签: clojure

按照以下链接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.

2 个答案:

答案 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数据库和调用存储过程一起使用时,我发现这个有用。当然,不是一个推荐的事情,因为你做了非常脆弱的代码(虽然这种方法最初解决了我的问题,库继续前进,因为我的代码不礼貌,它打破了 - 这是可以的,因为我只需要这个级别的功能短期)。