Die Lösung in der akzeptierten Antwort funktioniert nur auf dem Server und wenn der Benutzer, der die Abfrage ausführt, die Berechtigung zum Lesen der Datei hat, wie in dieser SO-Antwort erläutert.
Andernfalls besteht ein flexiblerer Ansatz darin, COPY
von SQL zu ersetzen Befehl mit dem psql
's "Meta-Befehl" namens \copy
das dieselben Optionen wie das "echte" COPY akzeptiert, aber innerhalb des Clients ausgeführt wird (ohne dass ;
erforderlich ist am Ende):
psql -c "\copy tbname FROM '/tmp/the_file.csv' delimiter '|' csv"
Laut Dokumentation ist die Datei \copy
Befehl:
Führt eine Frontend-(Client-)Kopie durch. Dies ist eine Operation, die einen SQL COPY-Befehl ausführt, aber anstatt dass der Server die angegebene Datei liest oder schreibt, liest oder schreibt psql die Datei und leitet die Daten zwischen dem Server und dem lokalen Dateisystem weiter. Das bedeutet, dass die Dateizugriffsrechte und -privilegien die des lokalen Benutzers sind, nicht die des Servers, und dass keine SQL-Superuser-Privilegien erforderlich sind.
Außerdem, wenn die the_file.csv
enthält in der ersten Zeile den Header, erkennbar am Zusatz header
am Ende des obigen Befehls:
psql -c "\copy tbname FROM '/tmp/the_file.csv' delimiter '|' csv header"