Clojure 2024 状态调查中分享你的想法!

欢迎!请参阅关于页面了解更多该功能的信息。

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聊天链接,不知为何它成功了,因此我编辑了消息。

再次感谢,待会儿见!
...