2012-05-04 35 views
5

używam JDBC z lokalnym Postgres DB do kopiowania danych z plików CSV do bazy danych za pomocą polecenia Postgres kopiowania. Używam języka Java, aby przeanalizować istniejący plik CSV w formacie CSV zgodnym z tabelami w bazie danych. Następnie zapisuję ten przeanalizowany plik CSV na dysku lokalnym. Następnie JDBC wykonuję polecenie COPY, używając sparsowanego pliku CSV do mojej lokalnej bazy danych. Wszystko działa zgodnie z oczekiwaniami. Teraz próbuję wykonać ten sam proces na DB PostgreSQL na zdalnym serwerze przy użyciu JDBC. Jednak, gdy JDBC próbuje wykonać kopiowanie I dostaćCzy PostgreSQL COPY odczytuje CSV ze zdalnej lokalizacji?

org.postgresql.util.PSQLException: ERROR: could not open file "C:\data\datafile.csv" for reading: No such file or directory 

Am I poprawne w zrozumieniu, że polecenie COPY mówi DB szukać lokalnie dla tego pliku? TO ZNACZY. serwer zdalny szuka na dysku C: (nie istnieje).

Jeśli jest to przypadek, czy jest tak, aby wskazać polecenia kopiowania, aby spojrzeć na moim komputerze, a nie „lokalnie” na zdalnym komputerze? Czytając dokumentację kopiowania, nie znalazłem niczego, co wskazywałoby tę funkcjonalność.

Jeśli ta funkcja nie istnieje, myślę, że po prostu zapełniam lokalnie całą bazę danych, a następnie skopiuję ją do bazy danych na zdalny serwer, ale chciałem tylko sprawdzić, czy niczego mi nie brakuje.

Dzięki za pomoc.

Odpowiedz

4

Jeśli używasz JDBC, najlepszym rozwiązaniem dla ciebie jest, aby korzystać z interfejsu API PostgreSQL COPY http://jdbc.postgresql.org/documentation/publicapi/org/postgresql/copy/CopyManager.html

W przeciwnym razie (jak już zauważono w innych) można użyć \ kopię z psql, który pozwala na dostęp do plików lokalnych na maszyna klient

+0

Dzięki za odpowiedź. Nie wiedziałem, że ta klasa istnieje. Zamierzam to zaimplementować w moim programie Parsing/Importing. Aby obsłużyć dane w przyszłości. – babcoccl

1

Według mojej wiedzy, komenda COPY może być stosowany tylko do odczytu lokalnie (zarówno ze standardowego wejścia lub z pliku) z komputera, na którym uruchomiony jest baza danych.

Można zrobić skrypt, w którym prowadzony Ci konwersję java, a następnie użyć psql zrobić \copy polecenie, które odczytuje dane z pliku na klienta maszyny.

+1

COPY może odczytać "Z STDIN" - nie musi czytać pliku z dysku, per se. –

+0

@FrankFarmer Zaktualizowano za komentarz. –

5

Utwórz plik sql następująco na komputerze klienckim

COPY testtable (column1, c2, c3) FROM STDIN WITH CSV; 
1,2,3 
4,5,6 
\. 

następnie wykonać na kliencie

psql -U postgres -f /mylocaldrive/copy.sql -h remoteserver.example.com

+0

Dzięki, to właśnie zrobiłem (w jakiejś formie), ponieważ ostatecznie miałem już tabelę utworzoną na mojej lokalnej maszynie. Idąc dalej, zamierzam użyć interfejsu API wymienionego poniżej. – babcoccl

Powiązane problemy