1

I found a weird behaviour connection from command line. My server is a docker container with postgres user and example as password.

if I connect with URI

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

Works pretty fine

but If specify the --dbname

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

Fails with the following error:

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"?

anybody know why this weird behaviour?

Update:

If I use this format

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

Works fine.

asked Aug 30, 2021 at 15:45

2 Answers 2

2

A connection string URI is just an elaboration on a dbname. Since you explicitly specified a dbname with the --dbname flag, then the positional argument (that is, the URI) gets interpreted as something else (in this case a username, but that doesn't matter for you as you don't get far enough to fail for that reason).

So as far as psql is concerned, you told it to connect to the database 'postgres', as the user 'postgres://postgres:example@localhost:5432', and to use the default port and host. But the default host means it is trying to use the Unix-domain socket, which psql thinks should be in /tmp but apparently it is not actually there. (this suggests that maybe psql and postgres itself were installed by different methods--normally they should agree on where the Unix-domain socket should be)

The correct way to specify the database name when using an URI is to put it into the URI after a slash:

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

You could instead do:

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

In the one that you report as "works", 'metric' is being ignored. Normally the second positional argument is interpreted as the username, but since the URI already specified a username there was nothing left to for another positional argument to do.

answered Aug 31, 2021 at 3:37
1

perhaps you need to do this:

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

The official documentation states usage is:

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

That indicates you need to put the options prior to the server name.

answered Aug 30, 2021 at 16:09
2
  • Windows demands the options to be first, but on Linux the getopt library accepts the options out of order. Commented Aug 31, 2021 at 3:45
  • Ahh, good to know. I upvoted your answer. Commented Aug 31, 2021 at 12:17

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.