Accessing the PostgreSQL Command Line in Docker
    May 22, 20245 min read
    arpan

    When working with a Django application using Docker, you might find yourself needing to access the PostgreSQL command line. There are a couple of ways to do this, but it’s not always straightforward. Here’s a guide to help you navigate the process and avoid common pitfalls.

    Using python manage.py dbshell

    Django provides a convenient command to access the database shell via python manage.py dbshell. This command automatically runs the appropriate command-line client for your database engine:

    For PostgreSQL, it runs psql.

    For MySQL, it runs mysql.

    For SQLite, it runs sqlite3.

    For Oracle, it runs sqlplus.

    Let's try using this command in our Docker setup:

    sudo docker-compose exec web python manage.py dbshell

    Common Issue: CommandError

    If you encounter the following error:

    CommandError: You appear not to have the 'psql' program installed or on your path.

    This happens because psql is not installed in the web container, which is where your Django application is running. Instead of installing psql in the web container, we can directly access psql from the PostgreSQL container.

    Directly Running psql from the PostgreSQL Container

    Connect to PostgreSQL:

    sudo docker-compose exec db psql

    If you get an error like:

    psql: error: could not connect to server: FATAL:  role "root" does not exist

    This indicates that psql is trying to connect using the root user, which doesn’t exist by default. To fix this, we need to use the correct user credentials.

    Specify the User

    Use the -U flag to specify the PostgreSQL user:

    sudo docker-compose exec db psql -U postgres

    You should now see the psql prompt:

    postgres=#

    If you encounter an error like:

    psql: error: FATAL:  database "postgres" does not exist

    it means you need to specify both the database name and the username.

    Specify Database and User

    Use the -d flag to specify the database, and the -U flag to specify the user

    sudo docker-compose exec db psql -d your_database -U your_username

    Replace your_database and your_username with the actual database name and username from your .env file. For example, if your .env file has:

    POSTGRES_DB=mydb
    POSTGRES_USER=myuser
    POSTGRES_PASSWORD=mypassword

    Then your command should be:

    sudo docker-compose exec db psql -d mydb -U myuser
    DockerPostgreSQL

    © 2025 Arpan Pokharel