I'm generating a list of SQL commands to export some data that I ultimately run using psql -f. The queries all get the same subset of data, so I thought I'd factor the qualifications out and put a list of eligible user ids in a temporary tables like so
create temporary table tmp_export_users as (select id from users where ...)
then refer back to that in my \copy commands like
\copy (select ... from table where user_id in (select id from tmp_export_users)) TO 'filename.csv' WITH CSV HEADER
Those are all in the same file, one per line, and running them -f I get the error that the copy commands can't see the temporary table, so I'm guessing that the client copy command must not actually use the same postgres session as psql.
Is that correct? Is there a way to change that behavior?
Best Answer
\copy
can use a temporary table.First I tested and confirmed this with version 9.0 at the command line.
Then I created a file with SQL and psql meta command
\copy
using multiple temporary tables. That worked for me, too.Call:
Note the terminating semicolon, which is optional at the end of a file (terminated implicitly), but required after any other SQL statement and also after the last one if executed in psql interactively.
Normally, psql meta-commands cannot be mixed with SQL on the same line in a file executed per
psql -f
. I quote the manual on psql:Different rules apply after
\copy
, though. Essentially, psql switches back to SQL mode automatically after\copy
See:But you wrote you had all commands on separate lines. So that cannot be the explanation in your case.
All that aside, have you considered using
COPY
(the SQL command) instead of\copy
(the psql meta-command)?Of course, the target file would have to be local to the server not the client in this case. And different file privileges apply. The manual: