【问题标题】:java.jdbc clojure execute! insert arityjava.jdbc clojure 执行!插入数量
【发布时间】: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 将是一个更好的选择,所以这一点很清楚。

标签: java postgresql jdbc clojure


【解决方案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/

【讨论】:

    猜你喜欢
    • 2012-06-14
    • 2020-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-12
    • 1970-01-01
    • 2011-04-02
    • 2014-05-22
    相关资源
    最近更新 更多