psql: PostgreSQL
Je opent een terminal, typt `psql`, en staat opeens tegenover een prompt die eruitziet als `postgres=#`. Geen knoppen, geen menu’s, geen muis. Alleen een cursor die wacht op SQL.
Voor wie dagelijks met PostgreSQL werkt is dat geen beperking. Het is de snelste weg van gedachte naar query, en terug. psql is de standaard terminal-client die met elke PostgreSQL-installatie meekomt, op Linux, macOS en Windows. Het is geen grafische tool en probeert dat ook niet te zijn.
Wat psql bijzonder maakt is de combinatie van twee talen. Je typt gewone SQL, maar daarnaast heeft psql eigen meta-commands die met een backslash beginnen. `\l` toont alle databases, `\dt` alle tabellen in het huidige schema, `\d` details over één tabel of view. Geen systeemtabellen raadplegen, geen joins op `pg_catalog`. Gewoon een backslash, één letter, Enter.
Die meta-commands zijn geen SQL. psql vangt ze af voordat ze de database bereiken en vertaalt ze intern naar de queries die je anders zelf had moeten schrijven. Het scheelt typwerk, maar het belangrijkste is dat je niet steeds uit je SQL-gedachte hoeft te stappen om te onthouden hoe die ene systeemquery ook alweer in elkaar zat.
De geschiedenis werkt zoals je van een fatsoenlijke command-line tool mag verwachten. Elke query die je invoert wordt automatisch opgeslagen, en bij de volgende sessie blader je er met de pijltjestoetsen doorheen. Op Unix-achtige systemen staat die historie in `~/.psql_history`, op Windows in `%APPDATA%\postgresql\psql_history`.
Wil je de historie niet op de standaardplek, dan kun je die verplaatsen met de omgevingsvariabele `PSQL_HISTORY`. Zet hem in je `.bashrc` of `.zshrc` en elke sessie schrijft naar jouw gekozen bestand. Er is ook een interne variabele `HISTFILE`, die je per sessie kunt instellen. Handig als je op één machine aan meerdere projecten werkt en de query’s gescheiden wilt houden. Of als je niet wilt dat een collega die `DROP TABLE` van gisteravond terugvindt in jouw historie.
Voor wie psql vooral in scripts gebruikt zijn de bestandscommando’s belangrijker. Met `\i bestand.sql` lees je een SQL-bestand in, en met `-f bestand.sql` op de commandoregel doe je hetzelfde zonder interactieve sessie. De uitvoer van een query vang je met `\o uitvoer.txt` weg naar een bestand. Daarmee wordt psql bruikbaar in cron-taken en CI/CD-pijplijnen, precies waar een grafische client niets te zoeken heeft.
De verbinding zelf regelt psql via dezelfde mechanismen als elke andere PostgreSQL-client. SSL-versleuteling, authenticatie via `.pgpass` of ident, verbinding over Unix-sockets of TCP/IP — het zit er allemaal in. Je kunt vanaf een ontwikkelwerkstation een productiedatabase op een andere server benaderen, of via SSH op een server draaien zonder dat er ooit een grafische omgeving aan te pas komt.
Back-ups maken doet psql niet. Daar heb je `pg_dump` en `pg_dumpall` voor. Maar een back-up in plain SQL-formaat terugzetten doe je weer wél met psql: `psql -d databasenaam -f backup.sql`. Het programma is daarmee het uitvoeringskanaal voor herstel, ook al heeft het de back-up zelf nooit gemaakt.
De PostgreSQL Global Development Group omschrijft psql in de officiële documentatie als een terminal-based front-end to PostgreSQL. Die formulering is sinds versie 7.0 ongewijzigd, en dat is veelzeggend. Het programma is niet meegegroeid met de mode van grafische interfaces of web-based dashboards. Het is blijven doen wat het altijd deed: een tekstuele interface bieden naar een relationele database, zonder franje.
Dat betekent ook dat je er iets voor moet leren. De meta-commands zijn niet ontdekkbaar vanuit de interface zelf; je moet ze kennen of opzoeken. Wie gewend is aan een klikbare database-client zal de eerste dagen regelmatig `\?` intoetsen om de lijst met beschikbare commands te zien. Die lijst is lang, en dat is eerlijk gezegd ook de zwakte van psql: de drempel ligt niet bij SQL, maar bij het onthouden van al die backslash-combinaties.
Daar staat tegenover dat je niets extra’s hoeft te installeren. Elke PostgreSQL-installatie levert psql mee, op elk ondersteund platform. Geen aparte package, geen plugin, geen versie die niet matcht met de server. Het is er gewoon, en het werkt met de versie van PostgreSQL die je draait.
Voor wie regelmatig met PostgreSQL werkt is psql daarmee niet één tool naast andere. Het is de tool waar je naar terugvalt als de grafische client te traag is, te beperkt, of gewoon niet beschikbaar op de server waar je moet zijn. Het is de gemeenschappelijke deler tussen een laptop, een productieserver en een container die draait in een omgeving waar niets grafisch bestaat.
De vraag is niet of psql beter is dan een grafische client. De vraag is waar je werkt en wat je doet. Wie af en toe een query draait op een lokale database heeft aan een grafische tool genoeg. Wie servers beheert, migraties draait of backups terugzet, komt vroeg of laat in een terminal terecht. En dan blijkt die ene backslash opeens sneller dan welke muis ook.