我正在使用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!
任何帮助都会很棒。
答案 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: