El archivo CSV de importación de PostgreSQL causa un error de sintaxis

8

Estoy intentando importar un archivo CSV a una base de datos mediante el comando "COPIAR"; sin embargo, aparece el error (lo que parece común) de que necesito ser un superusuario y que debería usar "\ copy" en su lugar. Sin embargo, cuando uso \ copy, obtengo un error de sintaxis:

ERROR:  syntax error at or near "\"
LINE 1: \copy

Con el cursor apuntando a "\". Aquí está mi consulta:

\copy tablename(column2, column3, column4, column5) from '/home/uploads/data.csv' WITH DELIMITER ',' CSV HEADER'

Intenté "copiar" y "\ copiar". El primero me da un error de superusuario, el último me da ese error de sintaxis. ¿Alguna idea sobre cómo solucionarlo? ¿hazlo funcionar?

Estoy ejecutando el comando a través del campo de entrada sql de myPgAdmin.

La única otra pregunta que tengo es sobre la importación de las columnas a través del nombre de la tabla (column2, column3, etc.) ¿Es esa la sintaxis correcta para eso?

antjanus
fuente

Respuestas:

8

\copyes un comando psql (línea de comando). Es no una orden regular de SQL.

Deberá usar COPY en su lugar (pero eso requiere que el archivo esté presente en el servidor de la base de datos)

un caballo sin nombre
fuente
¿Cómo importaría archivos CSV directamente a través de SQL en lugar de usar una línea de comandos?
antjanus
1
@antjanus: usaría el comando COPIAR como he mencionado (y Adam explicó en detalle)
a_horse_with_no_name
de nuevo, eso requiere permisos de superusuario y no es seguro, ¿verdad?
antjanus
4

Consulte el manual de postgres para COPIA .

En pgAdmin (o la cadena sql que pasa a través de un script u otra conexión db) simplemente usaría COPY sin el prefijo "\".

así que ingrese algo como: COPY tablename....

Debe asegurarse de tener los privilegios relevantes para ejecutar el comando, por lo que en este caso debe poder iniciar sesión en la base de datos y tener acceso de escritura a 'tablename'. Postgres también debe poder acceder al archivo, por lo que la ruta / home / uploads / debe estar accesible en el servidor de la base de datos y el usuario de postgres debe poder leer el archivo; verifique los permisos para el archivo y el directorio.

adam f
fuente
2

En mi sistema 9.1, el error que obtengo es bastante informativo:

or_examples=> copy comp_table_test from '/tmp/test';
ERROR:  must be superuser to COPY to or from a file
HINT:  Anyone can COPY to stdout or from stdin. psql's \copy command also works for anyone.

Si vuelve a leer la pista cuidadosamente, observa que puede copiar desde stdin. Esto es lo que \ copy en psql realmente hace en el back-end. Consulte los documentos en http://www.postgresql.org/docs/8.3/static/sql-copy.html para obtener más información.

Luego puede poner el cuerpo de la copia en su consulta o al menos así es como funciona en psql.

Chris Travers
fuente
1
copy coordina from '/tmp/filename.txt' WITH NULL AS ;

Así es como lo hago en pgAdmin3. Pero revise los derechos de usuario con cuidado, a veces los derechos son el problema. (usuario postgres en filename.txt / chmod 777)

Martín
fuente
tienes que ser un superusuario de db para hacer eso, de ahí la queja original.
Chris Travers
0

Otro método es crear una vista para la consulta sql. Luego use el comando \ copy.

NinjaLoop
fuente
2
Una mayor exposición sería de gran ayuda.
Michael Green
¿Cómo ayuda una vista al importar datos?
a_horse_with_no_name