\copy
può usare una tabella temporanea.
Prima ho provato e confermato questo con la versione 9.0 dalla riga di comando.
Quindi ho creato un file con meta comando SQL e psql \copy
usando più tabelle temporanee. Questo ha funzionato anche per me.
CREATE TEMP TABLE tmp as SELECT * FROM tbl;
\copy (SELECT * FROM tmp JOIN tbl USING (id)) TO '/var/lib/postgres/test1.csv';
Chiamata:
psql -p5432 mydb -f test.sql
Nota il punto e virgola di chiusura, che è facoltativo alla fine di un file (terminato implicitamente), ma richiesto dopo qualsiasi altra istruzione SQL e anche dopo l'ultima se eseguito in psql in modo interattivo.
Normalmente , i meta-comandi psql non possono essere mescolati con SQL sulla stessa riga in un file eseguito per psql -f
. Cito il manuale su psql :
L'analisi degli argomenti si interrompe alla fine della riga o quando viene trovata un'altra barra rovesciata non quotata. Una barra rovesciata non quotata viene considerata come l'inizio di un nuovo meta-comando. La sequenza speciale \\
(due barre rovesciate) segna la fine degli argomenti e continua a analizzare i comandi SQL, se presenti. In questo modo i comandi SQL e psql possono essere liberamente miscelati su una riga. Ma in ogni caso, gli argomenti di un meta-comando non possono continuare oltre la fine della riga.
Tuttavia, dopo si applicano regole diverse \copy
. In sostanza, psql torna automaticamente alla modalità SQL dopo \copy
Vedi:
Ma hai scritto di avere tutti i comandi su righe separate. Quindi questa non può essere la spiegazione nel tuo caso.
A parte questo, hai considerato di usare COPY
(il comando SQL ) invece di \copy
(il meta-comando psql )?
Naturalmente, il file di destinazione dovrebbe essere locale al server e non al client in questo caso. E si applicano privilegi di file diversi. Il manuale :
I file nominati in un COPY
comando vengono letti o scritti direttamente dal server, non dall'applicazione client. Pertanto, devono risiedere o essere accessibili al computer del server di database, non al client. Devono essere accessibili e leggibili o scrivibili dall'utente PostgreSQL (l'ID utente utilizzato dal server), non dal client.