Postgresql
PostgreSQL 連接 URI 有效,但參數失敗
我從命令行發現了一個奇怪的行為連接。我的伺服器是一個帶有 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]]
這表明您需要將選項放在**伺服器名稱之前。