2024 年 Clojure 状态调查! 中分享您的想法。

欢迎!请参阅 关于 页面以了解有关此信息的一些更多内容。

0
错误

Java 版本

openjdk 18.0.2-ea 2022-07-19
OpenJDK Runtime Environment (build 18.0.2-ea+9-Ubuntu-222.04)
OpenJDK 64-Bit Server VM (build 18.0.2-ea+9-Ubuntu-222.04, mixed mode, sharing)

但是当我在我文本编辑器中启动 nREPL 时,它说

Starting nREPL server...
/usr/lib/jvm/java-11-openjdk-amd64/bin/java ...

依赖关系

:dependencies [[org.clojure/clojure "1.11.1"]
               [com.github.seancorfield/next.jdbc "1.3.834"]
               [org.postgresql/postgresql "42.5.0"]
               [com.layerware/hugsql "0.5.3"]]

代码

(def db
    {:classname "org.postgresql.Driver"
     :subprotocol "postgresql"
     :subname "reporting"
     :user "admin"
     :password "admin"})

(defn add-user-transaction [users]
  (jdbc/with-transaction [t-conn db]
                         (if-not (find-user t-conn {:id (:id users)})
                           (add-user! t-conn users))))

在此配置下,一切照常工作,但是只有在

(add-user-transaction {:id "cheryl"
                   :pass "Cheryl"})

评估时出错误。

它在这Clojure: Execution error (SQLException) at java.sql.DriverManager/getConnection (DriverManager.java:702) 中已被询问并已经回答了,但那里的唯一答案是使用 :depsdeps.edn(据我所知,这是 Maven 仓库),那么 Leiningen 怎么样?或者我错过了有关 Leiningen 和 Maven 的某些内容?
甚至重启了电脑、文本编辑器和 nREPL,但没有任何变化。

1 答案

+1
 
最佳答案

您正在使用过时的 clojure.java.jdbc 格式的数据库规范 hash map,而不是 (更简单) 的 next.jdbc 格式。

您想要删除 :classname:subprotocol:subname,并使用 :dbtype "postgresql" :dbname "reporting" 代替。

这个更简单的格式也适用于 clojure.java.jdbc -- 并且也是那里推荐的方案。您正在使用的格式实际上是一个过时格式,已经有一段时间不推荐使用了。

by
谢谢,我已经按照你的建议做了,但是为了成功地验证代码(根据我正在学习的那本书),我需要将jdbc/with-transaction改为clojure.java.jdbc/with-db-transaction。

我试了Transaction next.jdbc文档,但是结果是

执行错误(ExceptionInfo)在hugsql.core/validate-parameters! (core.clj:83)。
    参数不匹配::id参数数据未找到。

我的代码如下
(defn add-user-transaction2 [user]
  (jdbc/with-transaction [t-conn db]
                         (if-not
                           (jdbc/execute! t-conn (find-user {:id (:id user)}))
                           (jdbc/execute! t-conn (add-user! user)))))

SQL 资源
-- :name find-user :? :1
-- 查找具有匹配ID的用户
SELECT *
FROM users
WHERE id = :id

-- :name add-user! :! :n
-- :doc 添加新用户
INSERT INTO users
(id, pass)
VALUES (:id, :pass)

我是不是犯了错误?(顺便说一句,如果我的回答看起来不整洁,那是因为答案部分没有提供像问题部分那样的工具)
by
你混淆了两个不同的库。鉴于我们将需要交互式地处理这个问题,我强烈建议你加入Clojurians Slack,那里有专门针对HugSQL以及SQL(涉及到clojure.java.jdbc和next.jdbc)的频道。

你可以在http://clojurians.net(以及阅读https://clojurians.slack.com上的消息)注册。

编辑了
这对我帮助很大!
真的非常感谢您帮助和回答我的问题!
我讨厌Slack的新邀请链接政策!他们把邀请链接的“使用次数”从2,000个新注册降低到只有400次,我们的链接比以前更快地过期。我又更新了http://clojurians.net,可能需要几个小时才能传播,但在此期间,这里是它目前重定向到的链接: https://join.slack.com/t/clojurians/shared_invite/zt-1h2vg9na9-BZjojSXd8hrARTsu0MSuYg(一旦有400个新用户注册,这个链接就会过期--但至少这次不会在30天后过期)。Slack上见!
在那次评论后,我访问了https://www.clojure.org/community/resources,然后点击了Clojurians Slack chat的链接,不知何故,它成功了,所以我编辑了信息。

再次感谢,再见!
...