September 2, 2026
3 min read
PostgreSQL — Commands & psql
Connecting
psql -U myuser -d mydb # Local connection
psql -U myuser -h localhost -p 5432 -d mydb # Explicit host/port
psql "postgresql://myuser:pass@localhost:5432/mydb" # Connection string
psql -U myuser -d mydb -c "SELECT version();" # Run single command
psql -U myuser -d mydb -f setup.sql # Execute SQL file
Environment Variables
export PGHOST = localhost
export PGPORT = 5432
export PGUSER = myuser
export PGDATABASE = mydb
# With these set, just run: psql
Password File (~/.pgpass)
# hostname:port:database:username:password
localhost:5432:mydb:myuser:secretpass
chmod 600 ~/.pgpass # Required permissions
psql Navigation
Command
Description
\l
List databases
\c dbname
Switch to database
\dt
List tables in current schema
\dt+
List tables with sizes
\d tablename
Describe table (columns, types, indexes)
\d+ tablename
Detailed description (storage, stats)
\di
List indexes
\dv
List views
\df
List functions
\du
List users/roles
\dn
List schemas
\dx
List installed extensions
\s
Command history
\e
Open last query in editor
\q
Quit psql
Display & Output
\x auto -- Toggle expanded display (vertical for wide tables)
\timing -- Show query execution time
\pset format csv -- Output as CSV
\pset format aligned -- Back to default table format
\o output.txt -- Redirect output to file
\o -- Stop redirect (back to screen)
Database Operations
CREATE DATABASE myapp ;
CREATE DATABASE myapp OWNER myuser ENCODING 'UTF8' ;
ALTER DATABASE myapp RENAME TO myapp_v2 ;
ALTER DATABASE myapp OWNER TO newowner ;
DROP DATABASE IF EXISTS myapp ;
\l -- List all databases with owner, encoding, size
Schema Operations
CREATE SCHEMA IF NOT EXISTS api ;
SET search_path TO api , public ;
DROP SCHEMA api CASCADE ; -- Drop schema + all objects
\dn -- List schemas
\dt api.* -- List tables in specific schema
Import & Export
# Export table to CSV
psql -U myuser -d mydb -c "\copy users TO 'users.csv' WITH CSV HEADER"
# Import CSV into table
psql -U myuser -d mydb -c "\copy users FROM 'users.csv' WITH CSV HEADER"
-- Inside psql:
\ copy users TO 'users.csv' WITH CSV HEADER
\ copy users FROM 'users.csv' WITH CSV HEADER
-- Export query result
\ copy ( SELECT * FROM users WHERE active = true ) TO 'active.csv' WITH CSV HEADER
Useful psql Tricks
# Search command history
Ctrl+R # Reverse search (like bash)
# Execute previous command
\g # Re-run last query
\g x # Re-run last query in expanded mode
# Show SQL behind psql shortcuts
\s et ECHO_HIDDEN on # See actual SQL when using \d, \dt, etc.
Transaction Control
BEGIN ; -- Start transaction
SAVEPOINT sp1 ; -- Create savepoint
ROLLBACK TO sp1 ; -- Rollback to savepoint
COMMIT ; -- Commit transaction
ROLLBACK ; -- Rollback entire transaction
databases
postgresql
sql