java.jdbc clojure 执行!插入数量

Posted

技术标签:

【中文标题】java.jdbc clojure 执行!插入数量【英文标题】:java.jdbc clojure execute! insert arity 【发布时间】:2018-06-01 16:18:10 【问题描述】:

我正在使用 java.jdbc 处理来自 clojure 的 postgres 数据库。

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

我想使用如下代码对数据库执行“更新插入”操作:

 (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!

任何帮助都会很棒。

【问题讨论】:

根据文档,它需要 2 个或 3 个参数:clojure.github.io/java.jdbc/#clojure.java.jdbc/execute! 你的 if 应该有一个 else 身体吗?你有错位的支架吗?如果它不应该有一个 else 主体,when 将是一个更好的选择,所以这一点很清楚。 【参考方案1】:

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

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

:multi? 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 早于现代习语。一个可能更直观的 API 可以通过一个更新的 jdbc 库获得,称为 clojure.jdbc(与 clojure.java.jdbc 相对):

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

【讨论】:

以上是关于java.jdbc clojure 执行!插入数量的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 clojure.java.jdbc 进行 UPSERT

clojure.java.jdbc 更新 id 在哪里

Clojure PostgreSQL JDBC执行查询时不断出错

使用clojure.java.jdbc在Clojure中使用外键约束

如何做批处理 jdbc/insert!和 jdbc/更新!在 Clojure 中使用 postgresql?

clojure.java.jdbc /查询大结果集懒惰