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 PostgreSQL JDBC执行查询时不断出错
使用clojure.java.jdbc在Clojure中使用外键约束