psql — Der interaktive PostgreSQL-Client

Praxis-Guide zu psql, dem interaktiven PostgreSQL-Client: verbinden, Queries ausführen und Schemas per Meta-Kommandos verwalten.

psql ist das interaktive Terminal von PostgreSQL: Hier verbindest du dich mit einer Datenbank, setzt SQL-Queries ab und steuerst den Client über Meta-Kommandos, die alle mit einem Backslash beginnen – etwa \l für alle Datenbanken, \dt für die Tabellen oder \d zum Beschreiben einer Tabelle. Neben dem reinen Abfragen erledigst du damit auch Administration: Rollen anlegen, Rechte vergeben, Datenbanken sichern und wiederherstellen. Dieser Guide bündelt die Befehle, die du im Alltag am häufigsten brauchst – vom Verbindungsaufbau bis zum CSV-Export.

Verbinden

psql -U <user> -d <database> — Verbindet sich als bestimmter Benutzer mit einer Datenbank.

psql -U postgres -d myapp

psql -h <host> -p <port> -U <user> -d <database> — Verbindet sich mit einem entfernten PostgreSQL-Server.

psql -h db.example.com -p 5432 -U admin -d myapp

psql '<connection-string>' — Verbindet sich über eine Verbindungs-URI.

psql 'postgresql://user:pass@host:5432/dbname'

psql -U <user> -d <database> -c '<query>' — Führt eine Query aus und beendet sich anschließend.

psql -U postgres -d myapp -c 'SELECT count(*) FROM users;'

psql -U <user> -d <database> -f <file> — Führt SQL aus einer Datei aus.

psql -U postgres -d myapp -f schema.sql

Meta-Kommandos — Information

\l — Listet alle Datenbanken auf.

\l

\c <database> — Wechselt zu einer anderen Datenbank.

\c myapp

\dt — Listet alle Tabellen im aktuellen Schema auf.

\dt

\dt+ — Listet Tabellen mit Größen und Beschreibungen auf.

\dt+

\d <table> — Beschreibt eine Tabelle (Spalten, Typen, Indizes).

\d users

\di — Listet alle Indizes auf.

\di

\dv — Listet alle Views auf.

\dv

\dn — Listet alle Schemas auf.

\dn

\df — Listet alle Funktionen auf.

\df

Meta-Kommandos — Werkzeuge

\x — Schaltet die erweiterte Anzeige um (vertikale Ausgabe).

\x auto

\timing — Schaltet die Anzeige der Ausführungszeit von Queries um.

\timing

\i <file> — Führt SQL aus einer Datei aus.

\i /path/to/migration.sql

\o <file> — Leitet die Query-Ausgabe in eine Datei um.

\o output.txt

\e — Öffnet den Query-Puffer in einem Editor.

\e

\q — Beendet psql.

\q

\? — Zeigt die Hilfe zu den Meta-Kommandos an.

\?

Rollen & Rechte

\du — Listet alle Rollen/Benutzer auf.

\du

CREATE ROLE <name> WITH LOGIN PASSWORD '<pass>'; — Legt eine neue Rolle mit Login-Berechtigung an.

CREATE ROLE appuser WITH LOGIN PASSWORD 'secretpass';

GRANT ALL PRIVILEGES ON DATABASE <db> TO <role>; — Vergibt alle Rechte an einer Datenbank.

GRANT ALL PRIVILEGES ON DATABASE myapp TO appuser;

GRANT SELECT ON ALL TABLES IN SCHEMA public TO <role>; — Vergibt Lesezugriff auf alle Tabellen eines Schemas.

GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;

ALTER ROLE <name> WITH <options>; — Ändert die Attribute einer Rolle.

ALTER ROLE appuser WITH CREATEDB;

Import & Export

pg_dump -U <user> <database> > <file> — Exportiert eine Datenbank als SQL.

pg_dump -U postgres myapp > backup.sql

pg_dump -U <user> -Fc <database> > <file> — Exportiert im eigenen, komprimierten Format.

pg_dump -U postgres -Fc myapp > backup.dump

pg_restore -U <user> -d <database> <file> — Stellt aus einem Dump im Custom-Format wieder her.

pg_restore -U postgres -d myapp backup.dump

\COPY <table> TO '<file>' CSV HEADER — Exportiert eine Tabelle als CSV.

\COPY users TO '/tmp/users.csv' CSV HEADER

\COPY <table> FROM '<file>' CSV HEADER — Importiert CSV-Daten in eine Tabelle.

\COPY users FROM '/tmp/users.csv' CSV HEADER

pg_dumpall -U <user> > <file> — Exportiert alle Datenbanken inklusive Rollen.

pg_dumpall -U postgres > all-databases.sql

Häufige Muster

psql -U <user> -d <database> -t -A -c '<query>' — Query ohne Kopfzeilen und ohne Ausrichtung (fürs Scripting).

psql -U postgres -d myapp -t -A -c 'SELECT email FROM users LIMIT 5'

SELECT pg_size_pretty(pg_database_size('<database>')); — Zeigt die Datenbankgröße in lesbarer Form an.

SELECT pg_size_pretty(pg_database_size('myapp'));

SELECT * FROM pg_stat_activity; — Zeigt aktuelle Verbindungen und laufende Queries an.

SELECT pid, state, query FROM pg_stat_activity;

SELECT version(); — Zeigt die PostgreSQL-Version an.

SELECT version();

Fazit

psql ist weit mehr als eine Eingabeaufforderung für SQL: Mit den Backslash-Meta-Kommandos inspizierst du Schemas, Indizes und Rollen in Sekunden, und über pg_dump/pg_restore hast du vollständige Backups in der Hand. Ein wichtiger Punkt zur Sicherheit: DROP, TRUNCATE und ein DELETE ohne WHERE sind nicht umkehrbar – arbeite auf Produktivdatenbanken am besten in einer Transaktion (BEGIN; … COMMIT;), damit du im Zweifel ein ROLLBACK machen kannst. Schreibe Passwörter nie im Klartext in Skripte oder die Befehlszeile: Lege sie in ~/.pgpass ab (mit chmod 600) oder gib sie über die Umgebungsvariable PGPASSWORD weiter – das gilt genauso für die Credentials von pg_dump.

Verwandte Kommandos

  • artisan – Kommandozeilen-Tool des Laravel-Frameworks für Migrationen, Tinker und Generatoren
  • cargo – Build-Tool und Paketmanager für Rust
  • composer – Abhängigkeitsverwaltung für PHP