java.jdbc clojure执行!插入arity

时间:2018-06-01 16:18:11

标签: java postgresql jdbc clojure

我正在使用java.jdbc从clojure使用postgres数据库。

[org.clojure/clojure "1.7.0"]
[org.clojure/java.jdbc "0.6.1"]
[org.postgresql/postgresql "9.4-1201-jdbc41"]

我想使用以下代码对数据库执行'upsert'操作:

 (if (-> updatesU count pos?) (sql/execute! spec ["insert into users(id, name) values (?, ?) on conflict(id) do update set name=EXCLUDED.name;"]  updatesU  {:multi? true} ))
 (if (-> updatesTE count pos?) (sql/execute! spec ["insert into time_entries(id, spent_date, hours, userid, project, task) values (?, ?, ?, ?, ?, ?) on conflict(id) do update set spent_date=EXCLUDED.spent_date, hours=EXCLUDED.hours;"] updatesTE {:multi? true} )))

文档似乎没有示例,所以我有点迷失了解决方案。

我收到此错误:

Exception in thread "main" clojure.lang.ArityException: Wrong number of args (4) passed to: jdbc/execute!

任何帮助都会很棒。

1 个答案:

答案 0 :(得分:0)

常见的情况是语句的参数作为标量进入向量内部:

(sql/execute! 
  spec 
  ["insert into users(id, name) values (?, ?) on conflict(id) do update set name=EXCLUDED.name;"  id name]  
  {:multi? false} ))

{:多? true}是指您多次执行语句,而不是一次使用多个参数,例如:

(sql/execute!
  spec
  ["insert into users(id, name) values (?, ?) on conflict(id) do update set name=EXCLUDED.name;"  [id1 name1] [id2 name2] [id3 name3]]
  {:multi? true} ))

此处还有一些其他示例:

http://clojure-doc.org/articles/ecosystem/java_jdbc/using_sql.html

clojure.java.jdbc库目前有一个伟大的,主动的,有用的维护者,但是一个令人困惑的遗留API,早于现代成语。可以通过一个名为clojure.jdbc的新jdbc库(而不是clojure.java.jdbc)提供更直观的API:

http://funcool.github.io/clojure.jdbc/latest/