Postgresql

PostgreSQL 連接 URI 有效,但參數失敗

  • August 31, 2021

我從命令行發現了一個奇怪的行為連接。我的伺服器是一個帶有 postgres 使用者和範例密碼的 docker 容器。

如果我用 URI 連接

psql postgres://postgres:example@localhost:5432

工作得很好

但如果指定 –dbname

psql postgres://postgres:example@localhost:5432 --dbname=postgres

失敗並出現以下錯誤:

psql: error: could not connect to server: No such file or directory
       Is the server running locally and accepting
       connections on Unix domain socket "/tmp/.s.PGSQL.5432"?

有人知道為什麼會出現這種奇怪的行為嗎?

更新:

如果我使用這種格式

psql postgres://postgres:example@localhost:5432 metric 

工作正常。

連接字元串 URI 只是對 dbname 的詳細說明。由於您使用 –dbname 標誌明確指定了一個 dbname,因此位置參數(即 URI)被解釋為其他內容(在本例中為使用者名,但這對您來說並不重要,因為您沒有得到由於這個原因足以失敗)。

所以就 psql 而言,您告訴它以使用者 ‘postgres://postgres:example@localhost:5432’ 的身份連接到數據庫 ‘postgres’,並使用預設埠和主機。但是預設主機意味著它正在嘗試使用 Unix 域套接字,psql 認為它應該在 /tmp 但顯然它實際上並不存在。(這表明 psql 和 postgres 本身可能是通過不同的方法安裝的——通常它們應該就 Unix 域套接字的位置達成一致)

使用 URI 時指定數據庫名稱的正確方法是在 URI 中加上斜杠:

psql postgres://postgres:example@localhost:5432/postgres

你可以改為:

psql --dbname=postgres://postgres:example@localhost:5432/postgres

在您報告為“有效”的那個中,“度量”被忽略了。通常第二個位置參數被解釋為使用者名,但是由於 URI 已經指定了一個使用者名,所以沒有什麼可以讓另一個位置參數去做。

也許你需要這樣做:

psql --dbname=postgres postgres://postgres:example@localhost:5432 

官方文件說明用法是:

psql [option...] [dbname [username]]

這表明您需要將選項放在**伺服器名稱之前。

引用自:https://dba.stackexchange.com/questions/298769