Rozwiązanie w zaakceptowanej odpowiedzi będzie działać tylko na serwerze i gdy użytkownik wykonujący zapytanie będzie miał uprawnienia do odczytu pliku, jak wyjaśniono w tej odpowiedzi SO.
W przeciwnym razie bardziej elastycznym podejściem jest zastąpienie COPY
SQL polecenie z psql
„meta-polecenie” o nazwie \copy
która przyjmuje wszystkie te same opcje, co "prawdziwa" KOPIA, ale jest uruchamiana wewnątrz klienta (bez potrzeby ;
na końcu):
psql -c "\copy tbname FROM '/tmp/the_file.csv' delimiter '|' csv"
Zgodnie z dokumentacją \copy
polecenie:
Wykonuje kopię frontendową (klienta). Jest to operacja, która uruchamia polecenie SQL COPY, ale zamiast odczytywania lub zapisywania przez serwer określonego pliku, psql odczytuje lub zapisuje plik i kieruje dane między serwerem a lokalnym systemem plików. Oznacza to, że dostęp do plików i uprawnienia są dostępne dla użytkownika lokalnego, a nie serwera, i nie są wymagane żadne uprawnienia superużytkownika SQL.
Ponadto, jeśli the_file.csv
zawiera nagłówek w pierwszym wierszu, można go rozpoznać dodając header
na końcu powyższego polecenia:
psql -c "\copy tbname FROM '/tmp/the_file.csv' delimiter '|' csv header"