I'm trying to use the psql command line on a Windows 11 machine to export the results of a query from a PostgreSQL 15 database to a CSV file.
The problem I am facing is that the query in question is this:
SELECT * FROM "MyTable"
but while this works fine when run via pgAdmin, if I run the following command line (connection parameters omitted for brevity):
./psql.exe -c "COPY (SELECT * FROM MyTable) TO 'c:/out.csv'"
I get an error saying:
ERROR: relationship "mytable" does not exist
ROW 1: COPY (SELECT * FROM MyTable) TO 'c:/out.csv'
I suspect that the problem might be that I'm not using the double quotes " around the table name, because if I run the query in pgAdmin without the double quotes I get the exact same error. But how do I put the double quotes in the command line? In the windows cmd/powershell command line the double quotes are argument value delimiters, so if I use them INSIDE the argument value it just truncates it.
I've tried using double quotes "" or the tick `" to escape it following some suggestions I've found online, but the error message never changes. What am I doing wrong here?
PS: I know I can launch PSQL in interactive shell mode and issue the command from there, but this is no good to me because this command is part of a script, I don't want it to be interactive, I want it to just execute and return to the command line.
You should be able to swap the internal single quotes
'for double-dollar quotes$$, which releases the string constant single quotes'to be used as outer quotes, and double-quotes for delimited identifier", which can simplify things.In PowerShell you won't need the backtick
`to protect the$because single-quoted strings are verbatim, already preventing their evaluation. As pointed out by @mklement0 below, what you will need in PS version <7.3.x is a backslash to let the parameter hold onto the double-quotes:As an alternative to
$$, you can double the single quotes around file name:Double-double-quoting should also work, but the backslash requirement complicates it a bit:
Note that regular
COPYhappens server-side.psqloffers client-side meta-command\copy:or trade
psqlforpg_dump, if you're fine with a.sqlor custom dump instead of a.csvIn
cmd, single outer quotes won't work, but double quotes on the inside work fine:If you're copying all columns and rows of the entire table, you can give both versions of
copyits name directly, instead of the(select * from "MyTable")or(table "MyTable"). Parenthesized syntax is more useful for queries with some additional complexity.