Nachdem Sie gelernt haben, den Code zu installieren, können wir uns das mit PostgreSQL mitgelieferte Frontend ansehen: Ein kleines Programm namens 'psql' bietet seit Jahren die Möglichkeit, direkt von der Kommandozeile aus mit einer PostgreSQL Datenbank zu kommunizieren.
psql bietet mittlerweile eine Vielzahl von Kommandozeilen Optionen. Sehen wir uns die aus unserer Sicht wesentlichsten Flags an:
Mit '-d' kann eine Datenbank spezifiziert werden - geben wir keinen Namen an, verwendet psql automatisch den Namen des aktuellen Betriebssystem Benutzers als Datenbanknamen:
[hs@hp hs]$ psql psql: FATAL: database "hs" does not exist
Ein weiteres Flag, das in der Praxis von essentieller Bedeutung ist, ist '-c'. Vor allem Datenbank Administratoren schätzen diese Funktionalität:
[hs@hp hs]$ psql -c 'SELECT 1+1' test
?column?
----------
2
(1 row)
Es ist also möglich, relativ einfach Shell Scripts zu schreiben, die ein Set von Befehlen ausführen. Alternativ zu '-c' können wir auch wie folgt vorgehen:
[hs@hp hs]$ echo 'SELECT 1+1' | psql test
?column?
----------
2
(1 row)
Mit Hilfe einer einfachen Pipe können Sie ganze Patch Jobs direkt abarbeiten lassen. Durch die gute Integration von psql in die UNIX Umgebung, lassen sich so alle beliebigen Aufgaben effizient realisieren.
Hin und wieder kann es recht aufschlussreich sein zu sehen, was psql wirklich an die Datenbank schickt. Da psql ein 'normales' C Programm ist, dass mit der Datenbank im Prinzip wie alle anderen Client Applikationen auch kommuniziert, wird einfach SQL zwischen psql und dem Server ausgetauscht. Das sind dann beispielsweise so aus:
[hs@athlon hs]$ psql -l -E
********* QUERY **********
SELECT d.datname as "Name",
pg_catalog.pg_get_userbyid(d.datdba) as "Owner",
pg_catalog.pg_encoding_to_char(d.encoding) as "Encoding",
d.datcollate as "Collation",
d.datctype as "Ctype",
pg_catalog.array_to_string(d.datacl, E'\n') AS "Access privileges"
FROM pg_catalog.pg_database d
ORDER BY 1;
**************************
List of databases
Name | Owner | Encoding | Collation | Ctype | Access privileges
-----------+-------+----------+-------------+-------------+-------------------
postgres | hs | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
template0 | hs | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/hs
: hs=CTc/hs
template1 | hs | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/hs
: hs=CTc/hs
test | hs | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
(4 rows)
Wie Sie sehen können, kommen die Daten einfach aus sogenannten Systemtabellen und werden dann einfach nur entsprechend aufformatiert. Das ist wichtig zu wissen, da viele Benutzer hinter psql ein hochkomplexes Ding vermuten, was aber nicht der Fall ist.
Wollen Sie das Ergebnis einer Abfrage direkt mit Hilfe der UNIX Shell weiterverarbeiten, empfiehlt es sich, Daten beispielsweise als CSV-Datei oder dergleichen auszugeben. Auch dafür gibt es eine Reihe von Flags. Das nächste Beispiel zeigt, wie eine einfache Systemtabelle abgefragt wird:
[hs@hp tmp]$ psql -c 'SELECT relname, relpages FROM pg_class limit 5' test -A -F ';' -t views;0 data_type_privileges;0 element_types;0 pg_toast_17173_index;1 pg_toast_17173;0
psql bietet auch die Möglichkeit, sich zu einem entfernten Host zu verbinden. In diesem Fall sind die Parameter '-h' (Host) und '-p' (Port) von Bedeutung. Wichtig zu bemerken ist allerdings, dass man sich mit psql zwar überall hin verbinden kann - die Gegenstelle aber mangels Netzwerkfreigabe einen Zugriff verweigern kann.
psql ist mit Sicherheit eines der effizientesten Command Line Interfaces, das man sich vorstellen kann. Durch die einfache Handhabung bleiben wohl kaum Wünsche offen.