Řešení v přijaté odpovědi bude fungovat pouze na serveru a když uživatel provádějící dotaz bude mít oprávnění číst soubor, jak je vysvětleno v této odpovědi SO.
Jinak je flexibilnějším přístupem nahradit COPY
SQL pomocí příkazu psql
"metapříkaz" nazvaný \copy
který má všechny stejné možnosti jako "skutečné" COPY, ale je spuštěn uvnitř klienta (bez potřeby ;
na konci):
psql -c "\copy tbname FROM '/tmp/the_file.csv' delimiter '|' csv"
Podle dokumentů \copy
příkaz:
Provede frontendovou (klientskou) kopii. Toto je operace, která spouští příkaz SQL COPY, ale místo toho, aby server četl nebo zapisoval zadaný soubor, psql čte nebo zapisuje soubor a směruje data mezi serverem a místním systémem souborů. To znamená, že přístupnost a oprávnění k souborům patří místnímu uživateli, nikoli serveru, a nejsou vyžadována žádná oprávnění superuživatele SQL.
Kromě toho, pokud the_file.csv
obsahuje záhlaví v prvním řádku, lze jej rozpoznat přidáním header
na konci výše uvedeného příkazu:
psql -c "\copy tbname FROM '/tmp/the_file.csv' delimiter '|' csv header"