\copy
kann eine temporäre Tabelle verwenden.
Zuerst habe ich dies mit Version 9.0 in der Kommandozeile getestet und bestätigt .
Dann habe ich eine Datei mit dem Meta-Befehl SQL und psql unter \copy
Verwendung mehrerer temporärer Tabellen erstellt. Das hat auch bei mir funktioniert.
CREATE TEMP TABLE tmp as SELECT * FROM tbl;
\copy (SELECT * FROM tmp JOIN tbl USING (id)) TO '/var/lib/postgres/test1.csv';
Anruf:
psql -p5432 mydb -f test.sql
Beachten Sie das abschließende Semikolon, das am Ende einer Datei optional ist (implizit beendet), aber nach jeder anderen SQL-Anweisung und auch nach der letzten erforderlich ist, wenn es interaktiv in psql ausgeführt wird.
Normalerweise können psql-Meta-Befehle nicht mit SQL in derselben Zeile in einer Datei gemischt werden, die per ausgeführt wird psql -f
. Ich zitiere das Handbuch auf psql :
Das Parsen nach Argumenten endet am Ende der Zeile oder wenn ein anderer nicht zitierter Backslash gefunden wird. Ein nicht zitierter Backslash wird als Beginn eines neuen Meta-Befehls verwendet. Die spezielle Sequenz \\
(zwei Backslashes) markiert das Ende der Argumente und setzt das Parsen von SQL-Befehlen fort, falls vorhanden. Auf diese Weise können SQL- und psql-Befehle in einer Zeile frei gemischt werden. In jedem Fall können die Argumente eines Meta-Befehls jedoch nicht über das Zeilenende hinaus fortgesetzt werden.
Unterschiedliche Regeln gelten nach \copy
, though. Im Wesentlichen wechselt psql nach \copy
See: automatisch in den SQL-Modus zurück :
Aber Sie haben geschrieben, Sie hätten alle Befehle in getrennten Zeilen. Das kann also nicht die Erklärung in Ihrem Fall sein.
Abgesehen davon haben Sie darüber nachgedacht, COPY
(den SQL-Befehl ) anstelle von \copy
(dem psql-Meta-Befehl ) zu verwenden?
Natürlich müsste die Zieldatei lokal auf dem Server sein, in diesem Fall nicht auf dem Client. Es gelten unterschiedliche Dateiberechtigungen. Das Handbuch :
In einem COPY
Befehl genannte Dateien werden direkt vom Server gelesen oder geschrieben, nicht von der Clientanwendung. Daher müssen sie sich auf dem Datenbankserver befinden und für diesen zugänglich sein, nicht auf dem Client. Sie müssen für den PostgreSQL-Benutzer (die Benutzer-ID, unter der der Server ausgeführt wird) und nicht für den Client zugänglich und lesbar oder beschreibbar sein.