\copy
puede usar una tabla temporal.
Primero probé y confirmó esto con la versión 9.0 en la línea de comando.
Luego creé un archivo con metacomando SQL y psql \copy
usando múltiples tablas temporales. También funcionó para mí.
CREATE TEMP TABLE tmp as SELECT * FROM tbl;
\copy (SELECT * FROM tmp JOIN tbl USING (id)) TO '/var/lib/postgres/test1.csv';
Llamada:
psql -p5432 mydb -f test.sql
Tenga en cuenta el punto y coma de terminación, que es opcional al final de un archivo (terminado implícitamente), pero se requiere después de cualquier otra instrucción SQL y también después de la última si se ejecuta en psql de forma interactiva.
Normalmente , los metacomandos psql no se pueden mezclar con SQL en la misma línea en un archivo ejecutado por psql -f
. Cito el manual en psql :
El análisis de argumentos se detiene al final de la línea o cuando se encuentra otra barra invertida sin comillas. Una barra invertida sin comillas se toma como el comienzo de un nuevo metacomando. La secuencia especial \\
(dos barras invertidas) marca el final de los argumentos y continúa analizando los comandos SQL, si los hay. De esa manera, los comandos SQL y psql se pueden mezclar libremente en una línea. Pero, en cualquier caso, los argumentos de un metacomando no pueden continuar más allá del final de la línea.
Sin embargo, se aplican diferentes reglas después \copy
. Esencialmente, psql vuelve al modo SQL automáticamente después de \copy
Ver:
Pero usted escribió que tenía todos los comandos en líneas separadas. Entonces esa no puede ser la explicación en su caso.
Aparte de eso, ¿ha considerado usar COPY
(el comando SQL ) en lugar de \copy
(el metacomando psql )?
Por supuesto, el archivo de destino tendría que ser local para el servidor y no para el cliente en este caso. Y se aplican diferentes privilegios de archivo. El manual :
Los archivos nombrados en un COPY
comando son leídos o escritos directamente por el servidor, no por la aplicación cliente. Por lo tanto, deben residir o ser accesibles para la máquina del servidor de la base de datos, no para el cliente. Deben ser accesibles para que el usuario de PostgreSQL pueda leerlos o escribirlos (el ID de usuario con el que se ejecuta el servidor), no el cliente.