使用Clojure和JDBC连接到PostgreSQL时,密码验证失败

6

我正在学习Clojure的Web开发,对于PostgreSQL和JDBC都不是专家。

我正在阅读《Clojure Web开发》这本书,但遇到了麻烦,因为我无法连接到PostgreSQL数据库,尽管我认为我已经按照教程一步步操作了。

我使用以下命令连接到psql:

sudo -u postgres psql

然后我创建了一个名为'admin'的管理员用户,并设置密码为'admin'

postgres=# CREATE USER admin WITH PASSWORD 'admin';
CREATE ROLE

然后我创建了一个名为 reporting 的数据库:

postgres=# CREATE DATABASE reporting OWNER admin;
CREATE DATABASE

到目前为止还没有任何投诉。

然后从我的Clojure代码中,我尝试连接数据库并创建表:

(ns reporting-example.models.db
  (:require [clojure.java.jdbc :as sql]))

;defining the db connection
(def db 
  {:subprotocol "postgresql"
   :subname "//localhost/reporting"
   :user "admin"
   :password "admin"})

;function for creating an 'employee' table
(defn create-employee-table []
  (sql/create-table :employee
                    [:name "varchar(50)"]
                    [:occupation "varchar(50)"]
                    [:place "varchar(50)"]
                    [:country "varchar(50)"])  
  )

; then trying to actually create the table, here's the part that breaks with an exception :
(sql/with-connection db
    (create-employee-table))

而我遇到了一个难看的错误:

org.postgresql.util.PSQLException: FATAL: password authentication failed for user "admin"

我觉得这不合理,凭证看起来没问题。

我在Counterclockwise REPL和Leiningen REPL中尝试了上述代码。我正在使用Ubuntu 13.10,如果有影响的话。

能有人解释一下我在这里做错了什么吗?谢谢!


你能使用相同的设置成功连接到 psql 吗?例如:在提示符处输入 psql -h localhost -U admin 并输入密码。我的第一个猜测是,你可能有两个不同端口监听的 PostgreSQL 安装,并且你在不同的端口上创建了用户,而你正在使用 Clojure 连接到另一个端口。 - Craig Ringer
不,我也不能以那种方式连接。错误信息是一样的。 - Valentin Waeselynck
2个回答

5

由于您无法使用相同的设置连接psql,因此有三种可能性:

  • 密码错误/拼写错误
  • 用户名错误/拼写错误
  • 您未连接到创建帐户的同一服务器。

要检查后者,请以创建帐户的方式连接,然后运行

show port;

确保与您在应用程序中指定的内容相同。这并不完美 - 如果其中一个实例没有在TCP/IP上侦听并且具有不同的套接字目录,则两个pg实例可以共享端口 - 但这是一个很好的第一次测试。

您还应该检查PostgreSQL服务器错误日志,因为它们可能包含有关身份验证失败性质的更详细信息。


你猜对了,“show port;” 命令产生了5433,而5432是默认值。所以现在我的Clojure程序可以工作了,非常感谢 :)!话虽如此,有没有简单的方法来改变这个不舒服的2-pg-instances情况呢? - Valentin Waeselynck
@ValentinWaeselynck 我建议您就此发布一个新问题,并提供更多关于您的操作系统/版本以及您如何安装所有内容的详细信息。您可以在 http://serverfault.com/ 或 http://dba.stackexchange.com/ 上发布。 - Craig Ringer

4
如果您尚未尝试过,请查看您的pg_hba.conf文件。它的名称类似于:
- /etc/postgresql/9.6/main/pg_hba.conf(Ubuntu 16.04) - /var/lib/pgsql/9.3/data/pg_hba.conf(Fedora 20)
您可能需要使用“find / -name pg_hba.conf”命令来定位它。
在文件底部,将“METHOD”值更改为本地测试时的“trust”(有关完整信息,请参阅postgres文档)。重新启动postgres以确保一切都是干净的,并且新的参数已被读取:
> sudo systemctl restart postgresql     # ubuntu

希望这能解决你的问题。我在Ubuntu / Fedora上也解决了我的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接