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.