2012-04-09 18 views
8

Chciałbym użyć funkcji COPY w PostgreSQL do importowania pliku CSV do bazy danych PostgreSQL.Funkcja COPY w PostgreSQL

gdzie jest napisane nazwę pliku w documentation, czy plik CSV muszą być przechowywane w określonym miejscu lub mogą być przechowywane w dowolnym miejscu. Na przykład copy data_table from '/tmp/outputdata.csv' WITH DELIMITER AS ',' CSV QUOTE AS '"';. Gdzie jest napisane tmp, oznacza to folder tmp na dysku C :. Czy można go zmienić na inną nazwę folderu?

Odpowiedz

15

Wygląda na to są mylone przez Linux vs. notacji file-path Windows. To, co tam masz, to ścieżka Linuksa zakotwiczona w katalogu głównym. System Windows używa liter dysków - które można określić równie dobrze w przypadku systemu Windows.

Jeśli używasz notacji systemu Windows, należy uważać, że trzeba ukośniki ewakuacyjnych jeśli nie używasz standard_conforming_strings = on - który jest domyślnym w najnowszej wersji 9.1, ale nie w starszych wersjach. W ten sposób:

COPY data_table from E'C:\\tmp\\outputdata.csv' WITH ... 

Działa w każdym przypadku.
Z standard_conforming_strings = on można również napisać:

COPY data_table from 'C:\tmp\outputdata.csv' WITH ... 

Należy pamiętać, że serwer PostgreSQL Okna rozumie również domyślną ścieżkę zapisu z ukośników zamiast ukośniki.

Dla SQL COPY FROM/TO można użyć dowolnej ścieżki, którą właściciel procesu serwera (domyślnie postgres) ma uprawnienia do odczytu/zapisu.

Należy zauważyć, że dla meta polecenia \copy klienta psql obowiązują uprawnienia bieżącego użytkownika lokalnego.

+0

Dziękuję za wyjaśnienie. – Jeiman

+0

Nie używaj polecenia COPY z pgAdmin na komputerze z systemem Windows i spróbuj odczytać plik z lokalnego środowiska Windows. To się nie powiedzie. Możesz mimo to zaimportować plik CSV. Użyj tego GUI. Kliknij prawym przyciskiem myszy na żądany stół i wybierz import ... – R13e

5

Tak, oczywiście możesz określić dowolną lokalizację, w której masz dostęp do odczytu. Nie ma problemu ze zmianą ścieżki pliku.

Przechowywać tylko uwagę na fakt, że na oknach trzeba uciec ukośnik w ten sposób:

copy data_table from 'c:\\Temp\\outputdata.csv' WITH DELIMITER AS ',' CSV QUOTE AS '"';