Estou gerando uma lista de comandos SQL para exportar alguns dados que executo usando psql -f. Todas as consultas obtêm o mesmo subconjunto de dados, então pensei em fatorar as qualificações e colocar uma lista de IDs de usuários qualificados em tabelas temporárias assim
create temporary table tmp_export_users as (select id from users where ...)
em seguida, consulte isso nos meus comandos \copy como
\copy (select ... from table where user_id in (select id from tmp_export_users)) TO 'filename.csv' WITH CSV HEADER
Esses estão todos no mesmo arquivo, um por linha, e executando-os -f recebo o erro de que os comandos de cópia não podem ver a tabela temporária, então estou supondo que o comando de cópia do cliente não deve realmente usar o mesmo postgres sessão como psql.
Isso é correto? Existe uma maneira de mudar esse comportamento?
\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.Ligar:
Observe o ponto e vírgula final, que é opcional no final de um arquivo (terminado implicitamente), mas necessário após qualquer outra instrução SQL e também após a última, se executada no psql interativamente.
Normalmente , meta-comandos psql não podem ser misturados com SQL na mesma linha em um arquivo executado por
psql -f
. Cito o manual no psql :No entanto, regras diferentes se aplicam após
\copy
. Essencialmente, o psql volta para o modo SQL automaticamente após\copy
Veja:Mas você escreveu que tinha todos os comandos em linhas separadas. Então essa não pode ser a explicação no seu caso.
Deixando tudo isso de lado, você já pensou em 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 para o cliente neste caso. E diferentes privilégios de arquivo se aplicam. O manual :