\copy
pode usar uma tabela temporária.
Primeiro testei e confirmei isso com a versão 9.0 na linha de comando.
Em seguida, criei um arquivo com o comando meta SQL e psql \copy
usando várias tabelas temporárias. Isso funcionou para mim também.
CREATE TEMP TABLE tmp as SELECT * FROM tbl;
\copy (SELECT * FROM tmp JOIN tbl USING (id)) TO '/var/lib/postgres/test1.csv';
Ligar:
psql -p5432 mydb -f test.sql
Observe o ponto-e-vírgula final, que é opcional no final de um arquivo (finalizado implicitamente), mas necessário após qualquer outra instrução SQL e também após a última se executado no psql interativamente.
Normalmente , os meta-comandos psql não podem ser combinados com o SQL na mesma linha em um arquivo executado por psql -f
. Cito o manual no psql :
A análise de argumentos para no final da linha ou quando outra barra invertida não citada é encontrada. Uma barra invertida não citada é tomada como o início de um novo meta-comando. A sequência especial \\
(duas barras invertidas) marca o final dos argumentos e continua analisando os comandos SQL, se houver. Dessa forma, os comandos SQL e psql podem ser livremente misturados em uma linha. Mas, em qualquer caso, os argumentos de um meta-comando não podem continuar além do fim da linha.
Regras diferentes se aplicam depois \copy
, no entanto. Essencialmente, o psql volta ao modo SQL automaticamente depois de \copy
Consulte:
Mas você escreveu que tinha todos os comandos em linhas separadas. Portanto, essa não pode ser a explicação no seu caso.
Tudo isso à parte, você considerou usar COPY
(o comando SQL ) em vez de \copy
(o meta-comando psql )?
Obviamente, o arquivo de destino teria que ser local para o servidor e não o cliente nesse caso. E diferentes privilégios de arquivo se aplicam. O manual :
Os arquivos nomeados em um COPY
comando são lidos ou gravados diretamente pelo servidor, não pelo aplicativo cliente. Portanto, eles devem residir ou estar acessíveis à máquina do servidor de banco de dados, não ao cliente. Eles devem estar acessíveis e legíveis ou graváveis pelo usuário do PostgreSQL (o ID do usuário no qual o servidor é executado), não pelo cliente.