Problem

Assume that we have installed a postgresql server in ubuntu system, and we have done these jobs:

  • Created a system/postgresql user named ‘bswen’
  • Created a postgresql database named ‘bswendb’
  • Changed the owner of the database ‘bswendb’ to user ‘bswen’

Now, we switched to user ‘bswen’ and then execute psql command in postgresql database environment , we got this problem:

[email protected]:~# sudo -i -u bswen
[email protected]:~$ psql
psql: FATAL:  database "bswen" does not exist

Environment

  • Postgresql 10.15
  • Ubuntu 18.04.4 LTS

Reason

By default, postgresql would expect the database name to be the same as the username of current logged in system user, e.g. the ‘bswen’ user need the ‘bswen’ database.

However, we did not create the ‘bswen’ databsae, but created the ‘bswendb’ database. To prove this, we can switch to the user ‘postgres’ in the system,and list databases, we get this result:

[email protected]:~# sudo -i -u postgres
[email protected]:~$ psql
postgres=# \l 

                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
 bswendb   | bswen    | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
   

Notice that there is no database named ‘bswen’ exists in the postgresql server, there is only ‘bswendb’ database in the server. So , how to solve this problem?

Solution

Option #1: Create a database named ‘bswen’ in the postgresql server

# switch to the postgres user and enter the postgresql command context
[email protected]:~# sudo -i -u postgres
[email protected]:~$ psql

# create database bswen
[email protected]:~$ createdb bswen

# change the owner of bswen database to user bswen
[email protected]:~$ psql
postgres=# ALTER DATABASE bswen OWNER TO bswen;
ALTER DATABASE

# check the databases
postgres=# \l

                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
 bswen     | bswen    | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 bswendb   | bswen    | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
(4 rows)

Now you can verify the effect:

# switch to the postgres user and enter the postgresql command context
[email protected]:~# sudo -i -u bswen
[email protected]:~$ psql
psql (10.15 (Ubuntu 10.15-0ubuntu0.18.04.1))
Type "help" for help.

bswen=> \conninfo
You are connected to database "bswen" as user "bswen" via socket in "/var/run/postgresql" at port "5432".
bswen=>

Success!

Option #2: Specify the database name when using psql command

If you don’t want to create database ‘bswen’ , and insist on using the database ‘bswendb’, you can do as follows:

# switch to the postgres user and enter the postgresql command context
[email protected]:~# sudo -i -u bswen

# specify the database when using psql command
[email protected]:~$ psql -d bswendb
psql (10.15 (Ubuntu 10.15-0ubuntu0.18.04.1))
Type "help" for help.

bswendb=> \conninfo
You are connected to database "bswendb" as user "bswen" via socket in "/var/run/postgresql" at port "5432".
bswendb=>

Notice that we used the command:

psql -d bswendb

You can view the help of psql like this:

 psql --help
 
 -d, --dbname=DBNAME      database name to connect to (default: "bswen")