# psql — Der interaktive PostgreSQL-Client

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

Source: https://www.jpkc.com/db/cheatsheets/build-languages/psql/

<!-- PROSE:intro -->
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.
<!-- PROSE:intro:end -->

## Verbinden

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

```bash
psql -U postgres -d myapp
```

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

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

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

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

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

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

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

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

## Meta-Kommandos — Information

`\l` — Listet alle Datenbanken auf.

```bash
\l
```

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

```bash
\c myapp
```

`\dt` — Listet alle Tabellen im aktuellen Schema auf.

```bash
\dt
```

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

```bash
\dt+
```

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

```bash
\d users
```

`\di` — Listet alle Indizes auf.

```bash
\di
```

`\dv` — Listet alle Views auf.

```bash
\dv
```

`\dn` — Listet alle Schemas auf.

```bash
\dn
```

`\df` — Listet alle Funktionen auf.

```bash
\df
```

## Meta-Kommandos — Werkzeuge

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

```bash
\x auto
```

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

```bash
\timing
```

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

```bash
\i /path/to/migration.sql
```

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

```bash
\o output.txt
```

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

```bash
\e
```

`\q` — Beendet psql.

```bash
\q
```

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

```bash
\?
```

## Rollen & Rechte

`\du` — Listet alle Rollen/Benutzer auf.

```bash
\du
```

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

```bash
CREATE ROLE appuser WITH LOGIN PASSWORD 'secretpass';
```

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

```bash
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.

```bash
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;
```

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

```bash
ALTER ROLE appuser WITH CREATEDB;
```

## Import & Export

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

```bash
pg_dump -U postgres myapp > backup.sql
```

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

```bash
pg_dump -U postgres -Fc myapp > backup.dump
```

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

```bash
pg_restore -U postgres -d myapp backup.dump
```

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

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

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

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

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

```bash
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).

```bash
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.

```bash
SELECT pg_size_pretty(pg_database_size('myapp'));
```

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

```bash
SELECT pid, state, query FROM pg_stat_activity;
```

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

```bash
SELECT version();
```

<!-- PROSE:outro -->
## 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`.

## Weiterführende Links

- [PostgreSQL – psql-Dokumentation](https://www.postgresql.org/docs/current/app-psql.html) – vollständige Referenz aller Optionen und Meta-Kommandos (englisch)
- [PostgreSQL – Handbuch](https://www.postgresql.org/docs/current/) – offizielle Dokumentation zu SQL-Befehlen, Rollen und Backups (englisch)
<!-- PROSE:outro:end -->

## Verwandte Kommandos

- [artisan](https://www.jpkc.com/db/cheatsheets/build-languages/artisan/) – Kommandozeilen-Tool des Laravel-Frameworks für Migrationen, Tinker und Generatoren
- [cargo](https://www.jpkc.com/db/cheatsheets/build-languages/cargo/) – Build-Tool und Paketmanager für Rust
- [composer](https://www.jpkc.com/db/cheatsheets/build-languages/composer/) – Abhängigkeitsverwaltung für PHP

