COPY FROM – czyli import danych (ładowanie) z pliku tekstowego (txt,csv) do bazy PostgreSQL (psql)

W systemie bazodanowym PostgreSQL możemy załadować (zaiportować) dane z pliku np. CSV do istniejącej już tabeli w bazie danych. Wykorzystamy do tego polecenie COPY FROM, którego składnia jest następująca:

COPY nazwa_tabeli FROM sciezka_do_pliku WITH DELIMITER 'separator' HEADER;

Za pośrednictwem DELIMITER możemy określić separator wykorzystany w pliku do rozdzielenia poszczególnych plików. Jeżeli użyjemy opcji HEADER pominiemy podczas ładowania danych do tabeli pierwszy wiersz z pliku. Pominięcie opcji HEADER spowoduje, że cały plik zostanie załadowany do tabeli.

UWAGA: Nie stosujmy opcji HEADER jeśli nasz plik nie zawiera nagłówka. Jeżeli to zrobimy pominiemy pierwszy wiersz podczas ładowania pliku.


Przykład 1:

Naszym zadaniem jest załadowanie pliku: oplaty.csv, który w pierwszym wierszu zawiera nagłówek – chcemy go pominąć podczas ładowania pliku do tabeli. Wartości w pliku rozdzielane są średnikami. Zapytanie ładujące plik do tabeli zestawienie_oplat będzie wyglądało następująco:

  • jeżeli wykonamy je bezpośrednio w psql:
\COPY zestawienie_oplat FROM oplaty.csv WITH DELIMITER ';' HEADER;
  • jeżeli wykonamy je poziomu wiersza poleceń:
psql -c '\COPY zestawienie_oplat FROM oplaty.csv WITH DELIMITER ';' HEADER;'


Przykład 2:

Tym razem załadujemy plik opisy.txt z katalogu: dodatki do tabeli baza_opisow. Plik źródłowy nie zawiera nagłówka, a dane w nim rozdzielone są znakiem pipe |.

  • jeżeli wykonamy polecenie je bezpośrednio w psql:
\COPY baza_opisow FROM dodatki/opisy.txt WITH DELIMITER '|';
  • jeżeli wykonamy je poziomu wiersza poleceń:
psql -c '\COPY baza_opisow FROM dodatki/opisy.txt WITH DELIMITER '|';'


UWAGA: Jeżeli podczas ładowania danych z plików otrzymamy błąd podobny do tego:

ERROR:  invalid input syntax for type integer: "id"
CONTEXT:  COPY nazwa_tabeli, line 1, column id: "id"

W tym przypadku oznacza on, iż w pierwszym wierszu pliku wartość nie jest zgodna z typem danych (kolumny id) określonym w naszej tabeli. Należy sprawdzić, czy czasami nie próbujemy załadować nagłówka. Jeżeli nie, bądź błąd występuje w innej linii należy zweryfikować poprawność ładowanych danych.