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: 执行错误(SQLException)在java.sql.DriverManager/getConnection (DriverManager.java:702),并且我已经回答了,但是那里的唯一答案是使用 :depsdeps.edn(据我所知,这是一个 Maven 仓库),那么 leiningen 呢?或者是我遗漏了关于 leiningen 和 Maven 的某些信息?
即使重启了我的电脑、文本编辑器和 nREPL,也没有任何改变。

1 答案

+1

被选中
 
最佳答案

你正在使用旧的 clojure.java.jdbc 格式的 db-spec 哈希表,而不是(更简单的)next.jdbc 格式。

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

这种更简单的格式也适用于 clojure.java.jdbc -- 在那里也是推荐的方法。您现在使用的格式实际上是一种遗产格式,很久以来就没有推荐使用了。

by
谢谢,我已经按照您的建议做了,而且成功了!但是我需要将 jdbc/with-transaction 改为 clojure.java.jdbc/with-db-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 上阅读消息)注册。
by
编辑 by
这对我帮助很大!
非常感谢您帮助和回答我的问题!
by
我讨厌 Slack 对邀请链接的新政策!他们把邀请链接的 “用途” 从 2,000 个新注册减少到只有 400,我们的链接比以前更快到期。我又更新了 http://clojurians.net,这可能需要几个小时才能推广,但暂时这里是它现在将要重定向到的链接:https://join.slack.com/t/clojurians/shared_invite/zt-1h2vg9na9-BZjojSXd8hrARTsu0MSuYg(一旦 400 个新用户注册,它就会过期——但至少这次它不会在 30 天后过期!)Slack 上见!
by
我评论之后,访问了 https://www.clojure.org/community/resources,然后点击了 Clojurians Slack 聊天的链接,不知为何它有效,因此我进行了编辑。

再次感谢,再见!
...