HOWTO · PostgreSQL
Führen Sie PostgreSQL-Abfragen in PSQL aus
In diesem Artikel wird beschrieben, wie Sie Abfragen über das PostgreSQL-Befehlszeilentool ausführen.
Auf dieser Seite
Mit psql, dem Terminalclient von PostgreSQL, können Sie SQL interaktiv ausführen, eine Abfrage an eine ausgewählte Datenbank senden oder Anweisungen aus einer .sql-Datei ausführen. Anders als pgAdmin läuft psql in einem Terminal und akzeptiert sowohl SQL-Anweisungen als auch eigene Backslash-Befehle. Die Beispiele setzen einen erreichbaren PostgreSQL-Server und eine Rolle mit Verbindungsberechtigung für die ausgewählte Datenbank voraus.
SQL-Anweisungen in einer interaktiven psql-Sitzung ausführen
Starten Sie eine interaktive Sitzung mit psql -U postgres -d postgres. Ersetzen Sie postgres durch eine Rolle und eine Datenbank, die in Ihrer Installation verfügbar sind. Geben Sie an der Eingabeaufforderung eine SQL-Anweisung ein und schließen Sie sie mit einem Semikolon ab. Das folgende Beispiel mit einer temporären Tabelle lässt sich in derselben Sitzung wiederholen. Vor dem Einfügen der beiden Zeilen wird die sitzungsbezogene Beispieltabelle geleert, sodass das angezeigte Ergebnis jedes Mal gleich bleibt.
CREATE TEMP TABLE IF NOT EXISTS bag (id integer PRIMARY KEY, model text NOT NULL);
TRUNCATE bag;
INSERT INTO bag (id, model) VALUES (1, 'Adidas'), (2, 'Jale') ON CONFLICT (id) DO UPDATE SET model = EXCLUDED.model;
SELECT id, model FROM bag ORDER BY id;
SELECT gibt die folgenden Spalten und Zeilen zurück:
| id | model |
|---|---|
| 1 | Adidas |
| 2 | Jale |
In einer interaktiven Sitzung wechselt die Eingabetaste zur nächsten Eingabezeile; sie schließt eine SQL-Anweisung nicht von selbst ab. Fehlt das abschließende Semikolon, nimmt psql weitere Eingaben entgegen und zeigt häufig eine Fortsetzungsaufforderung an. Fügen Sie das Semikolon hinzu, um die Anweisung abzuschließen. Wenn Sie die falsche Anweisung begonnen haben, können Sie mit \r den Abfragepuffer leeren und neu beginnen. Fügen Sie versehentlich einen weiteren Befehl hinzu, bevor Sie die erste Anweisung abschließen, behandelt psql die Eingabe als eine SQL-Anweisung, was zu einem Syntaxfehler führen kann.
Mit der Zieldatenbank verbinden und eine Abfrage ausführen
Mit \l oder \l+ können Sie die für Ihre Rolle sichtbaren Datenbanken auflisten (\l+ zeigt zusätzliche Details). Alternativ können Sie den PostgreSQL-Katalog mit SELECT datname FROM pg_database ORDER BY datname; abfragen. Der Katalog listet Datenbanken auf; ob Ihre Rolle eine Verbindung zu einer davon herstellen kann, hängt jedoch von den Berechtigungen und der Serverkonfiguration ab.
Verbinden Sie sich innerhalb von psql mit einer Datenbank, indem Sie \c postgres eingeben. Ersetzen Sie den Namen durch die Zieldatenbank. Mit \dt listen Sie Tabellen im aktuellen Suchpfad auf. Verwenden Sie \d, um weitere Relationstypen zu untersuchen; der Befehl listet auch Ansichten, Sequenzen und andere unterstützte Relationstypen auf. Soll die Verbindung bereits beim Start hergestellt werden, verwenden Sie die Option -d: psql -U postgres -d postgres.
Mit -c können Sie eine Abfrage übergeben, zum Beispiel: psql -U postgres -d postgres -c "SELECT datname FROM pg_database ORDER BY datname;". Diese Katalogabfrage funktioniert in einer neuen psql-Sitzung und setzt keine zuvor erstellten Tabellen voraus. Die Regeln für Anführungszeichen hängen von der Shell ab. In einer POSIX-kompatiblen Shell gruppieren doppelte Anführungszeichen den SQL-Text zu einem einzigen Kommandozeilenargument; sie gehören zur Shell-Syntax und sind keine SQL-Anführungszeichen. Enthält eine Abfrage SQL-Zeichenkettenliterale, gibt die Shell deren einfache Anführungszeichen innerhalb dieses doppelt angeführten Arguments weiter. In PowerShell oder der Eingabeaufforderung können sich Anführungszeichen und Maskierung anders verhalten; passen Sie den Befehl an die jeweilige Shell an. Ein Semikolon schließt die SQL-Anweisung ab, ist bei einer einzelnen mit -c übergebenen Anweisung am Ende aber optional.
Eine einzeilige Abfrage im Einzeilenmodus ausführen
Starten Sie psql mit -S oder --single-line, um den Einzeilenmodus zu aktivieren, zum Beispiel mit psql -U postgres -d postgres -S. In diesem Modus übermittelt ein Zeilenumbruch die aktuelle Eingabezeile als Abfrage. Geben Sie daher eine SQL-Anweisung pro Zeile ein. Geben Sie beispielsweise SELECT datname FROM pg_database ORDER BY datname ein und drücken Sie die Eingabetaste. Dieser Modus ist für einzeilige Eingaben gedacht. Verwenden Sie für mehrzeilige SQL-Anweisungen den normalen interaktiven Modus und schließen Sie die Anweisungen mit Semikolons ab.
SQL aus einer Datei mit psql ausführen
Um beim Start des Clients eine SQL-Datei auszuführen, verwenden Sie psql -U postgres -d postgres -f "/path/to/query.sql". Ersetzen Sie den Platzhalter durch den tatsächlichen Dateipfad. Pfade mit Leerzeichen müssen gemäß den Regeln Ihrer Shell in Anführungszeichen gesetzt werden; auch die Pfadtrenner hängen vom Betriebssystem und der Shell ab.
In einer bereits geöffneten interaktiven Sitzung führen Sie dieselbe Datei mit \i '/path/to/query.sql' aus. Die Datei muss in der Umgebung lesbar sein, in der psql läuft. Beide Methoden senden den SQL-Inhalt der Datei an die ausgewählte Datenbank. Prüfen Sie daher Datenbank und Rolle, bevor Sie Anweisungen ausführen, die Daten ändern.