De oplossing in het geaccepteerde antwoord werkt alleen op de server en wanneer de gebruiker die de query uitvoert, toestemming heeft om het bestand te lezen, zoals uitgelegd in dit SO-antwoord.
Anders is het een flexibelere benadering om de COPY
. van de SQL te vervangen commando met de psql
's "meta-commando" genaamd \copy
die dezelfde opties heeft als de "echte" COPY, maar wordt uitgevoerd in de client (zonder dat ;
nodig is aan het einde):
psql -c "\copy tbname FROM '/tmp/the_file.csv' delimiter '|' csv"
Volgens documenten, de \copy
commando:
Voert een frontend (client) kopie uit. Dit is een bewerking die een SQL COPY-opdracht uitvoert, maar in plaats van dat de server het opgegeven bestand leest of schrijft, leest of schrijft psql het bestand en routeert de gegevens tussen de server en het lokale bestandssysteem. Dit betekent dat de toegankelijkheid en privileges van bestanden die van de lokale gebruiker zijn, niet van de server, en er zijn geen SQL-superuser-privileges vereist.
Bovendien, als de the_file.csv
bevat de header in de eerste regel, deze kan worden herkend door header
toe te voegen aan het einde van het bovenstaande commando:
psql -c "\copy tbname FROM '/tmp/the_file.csv' delimiter '|' csv header"