请分享您的想法,参加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格式的数据库规范哈希表,而不是(更简单的)next.jdbc格式。

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

这种简单的格式也适用于clojure.java.jdbc,并且在这里也是推荐的方案。您正在使用的格式实际上是已经不建议使用一段时间的历史格式。

谢谢,我已经按照您的建议做了,并且它(代码)运行正常!但是我需要将jdbc/with-transaction更改为clojure.java.jdbc/with-db-transaction才能成功评估代码(根据我正在阅读的书籍)。

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

执行错误(异常信息)在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
-- find the user with a matching ID
SELECT *
FROM users
WHERE id = :id

-- :name add-user! :! :n
-- :doc adds a new user
INSERT INTO users
(id, pass)
VALUES (:id, :pass)

我这么做错了吗?(顺便说一句,如果我的回答看起来不那么整洁,因为答案部分不提供像问题部分那样的工具)
您混淆了两个不同的库。鉴于我们接下来需要交互式地处理这个问题,我强烈建议您加入Clojurians Slack,那里有专门用于HugSQL和SQL的通用频道(包括clojure.java.jdbc和next.jdbc)。

您可以在http://clojurians.net(以及在大夫_CODE flair)上注册(并在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聊天链接,不知何故一切正常,因此我编辑了消息。

再次感谢,再见!
...