JDBC /插入!在sqlite3上不管理两行以上

时间:2017-03-07 10:24:26

标签: jdbc clojure sqlite

我正在尝试使用池化连接批量写入sqlite3数据库,如clojure-cookbook中所述。

最多可以运行两行。当我插入三行时,我得到java.lang.ClassCastException: clojure.lang.MapEntry cannot be cast to clojure.lang.Named异常。

这是我的代码:

(def db-spec {:classname   "org.sqlite.JDBC"                                                                                                                                                                                                                                    
              :subprotocol  "sqlite"                                                                                                                                                                                                                                            
              :subname "sqlite.db"                                                                                                                                                                                                                                              
              :init-pool-size 1                                                                                                                                                                                                                                                 
              :max-pool-size 1                                                                                                                                                                                                                                                  
              :partitions 1})                                                                                                                                                                                                                                                   

(jdbc/db-do-commands                                                                                                                                                                                                                                                            
    *pooled-db*                                                                                                                                                                                                                                                                 
    (jdbc/create-table-ddl                                                                                                                                                                                                                                                      
      :play                                                                                                                                                                                                                                                                     
      [[:primary_id :integer "PRIMARY KEY AUTOINCREMENT"]                                                                                                                                                                                                                       
       [:data :text]]))                                                                                                                                                                                                                                                         

(jdbc/insert! *pooled-db* :play {:data "hello"}{:data "hello"})                                                                                                                                                                                                                 
(jdbc/insert! *pooled-db* :play {:data "hello"}{:data "hello"}{:data "hello"})   

我在这里缺少什么?

由于

1 个答案:

答案 0 :(得分:1)

请参阅此示例的文档:https://github.com/clojure/java.jdbc

(j/insert-multi! mysql-db :fruit
  [{:name "Apple" :appearance "rosy" :cost 24}
   {:name "Orange" :appearance "round" :cost 49}])

The API docs say this:

insert-multi!
function
Usage: (insert-multi! db table rows)
       (insert-multi! db table cols-or-rows values-or-opts)
       (insert-multi! db table cols values opts)
Given a database connection, a table name and either a sequence of maps (for
rows) or a sequence of column names, followed by a sequence of vectors (for
the values in each row), and possibly a map of options, insert that data into
the database.
When inserting rows as a sequence of maps, the result is a sequence of the
generated keys, if available (note: PostgreSQL returns the whole rows).
When inserting rows as a sequence of lists of column values, the result is
a sequence of the counts of rows affected (a sequence of 1's), if available.
Yes, that is singularly unhelpful. Thank you getUpdateCount and executeBatch!
The :transaction? option specifies whether to run in a transaction or not.
The default is true (use a transaction). The :entities option specifies how
to convert the table name and column names to SQL entities.