2012-05-04 35 views
5

He estado usando JDBC con un DB Postgres local para copiar datos de archivos CSV en la base de datos con el comando COPIA de Postgres. Utilizo Java para analizar el archivo CSV existente en un formato CSV que coincide con las tablas en el DB. Luego guardo este CSV analizado en mi disco local. Luego hago que JDBC ejecute un comando COPY usando el CSV analizado en mi DB local. Todo funciona como se espera Ahora estoy tratando de realizar el mismo proceso en una base de datos Postgres en un servidor remoto usando JDBC. Sin embargo, cuando se trata de JDBC para efectuar la copia consigo¿Puede COPG de PostgreSQL leer CSV desde una ubicación remota?

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

Estoy en lo correcto en el entendimiento de que el comando COPY le dice a la base de datos para buscar localmente para este archivo? ES DECIR. el servidor remoto está buscando en su unidad C: (no existe).

Si este es el caso, ¿hay alguna forma de indicarle al comando de copia que busque en mi computadora en lugar de "localmente" en la máquina remota? Al leer la documentación de copia, no encontré nada que indicara esta funcionalidad.

Si la funcionalidad no existe, estoy pensando en rellenar toda la base de datos localmente y luego copiar a la base de datos en el servidor remoto, pero solo quería comprobar que no me faltaba nada.

Gracias por su ayuda.

Respuesta

4

Si utiliza JDBC, la mejor solución para usted es utilizar la API de PostgreSQL COPIA http://jdbc.postgresql.org/documentation/publicapi/org/postgresql/copy/CopyManager.html

De lo contrario (como ya se ha señalado por otros) se puede usar \ copia de psql que permite acceder a los archivos locales en el máquina cliente

+0

Gracias por su respuesta. No sabía que esta clase existía. Voy a implementarlo en mi programa de análisis/importación. Para manejar datos en el futuro. – babcoccl

1

Que yo sepa, el comando COPY solo se puede utilizar para leer localmente (desde stdin o desde archivo) desde la máquina donde se está ejecutando la base de datos.

usted podría hacer un script de shell en el que se ejecuta la conversión de Java, a continuación, utilizar psql hacer un comando \copy, que se lee de un archivo en la máquina cliente .

+1

COPY puede leer "FROM STDIN" - no tiene que leer un archivo del disco, per se. –

+0

@FrankFarmer Actualizado según su comentario. –

5

crear el archivo sql como sigue en la máquina cliente

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

luego ejecutar, en su cliente

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

+0

Gracias, esto es lo que hice (de alguna forma) ya que finalmente ya tenía la tabla creada en mi máquina local. En el futuro, voy a utilizar la API que figura a continuación. – babcoccl

Cuestiones relacionadas