28

I need to export the resulting data from a query in PostgreSQL to Excel/CSV.
I use PostgreSQL 8.2.11.

SQL error:

ERROR:  relative path not allowed for COPY to file
In statement:

COPY (select distinct(m_price) from m_product)TO '"c:\auto_new.txt"';
4
  • 3
    The name is PostgreSQL or Postgres for short. There is no Postgre. Commented Nov 14, 2011 at 9:28
  • You only need to double-quote the filename if it includes whitespace or special characters. Not necessary for 'C:\\auto_new.txt'. (Not wrong, though.). There is Commented Nov 14, 2011 at 12:27
  • i tried giving >TO 'C:\\auto_new.txt' but the same error Commented Nov 14, 2011 at 12:28
  • There is also a space missing before TO. Not sure whether PostgreSQL 8.2 cares. It would still work in 9.0. Commented Nov 14, 2011 at 12:52

6 Answers 6

41

Example with Unix-style file name:

COPY (SELECT * FROM tbl) TO '/var/lib/postgres/myfile1.csv' format csv;

Read the manual about COPY (link to version 8.2).
You have to use an absolute path for the target file. Be sure to double quote file names with spaces. Example for MS Windows:

COPY (SELECT * FROM tbl)
TO E'"C:\\Documents and Settings\\Tech\Desktop\\myfile1.csv"' format csv;

In PostgreSQL 8.2, with standard_conforming_strings = off per default, you need to double backslashes, because \ is a special character and interpreted by PostgreSQL. Works in any version. It's all in the fine manual:

filename

 The absolute path name of the input or output file. Windows users might need to use an E'' string and double backslashes used as path separators.

Or the modern syntax with standard_conforming_strings = on (default since Postgres 9.1):

COPY tbl  -- short for (SELECT * FROM tbl)
TO '"C:\Documents and Settings\Tech\Desktop\myfile1.csv"' (format csv);

Or you can also use forward slashes for filenames under Windows.

An alternative is to use the meta-command \copy of the default terminal client psql.

You can also use a GUI like pgadmin and copy / paste from the result grid to Excel for small queries.

Closely related answer:

Similar solution for MySQL:

Sign up to request clarification or add additional context in comments.

19 Comments

COPY (SELECT * FROM tbl) TO 'C:/Documents and Settings/Tech/Desktop/myfile1.csv'; SQL error: ERROR: relative path not allowed for COPY to file
@soul: I suspect the whitespace in your filename. See my amended answer.
@soul: ah .. Windows needs backslashes. See amended answer. (I use Debian.)
@sanre6: Always remember that COPY handles files local to the server. If your client is on a different machine, use the meta-command \copy of the psql client or some other tool like pgAdmin.
@AKIWEB: Follow my link above and read the manual. If something is still unclear, ask a question. Comments are not the place.
|
10

In PostgreSQL 9.4 to create to file CSV with the header in Ubuntu:

COPY (SELECT * FROM tbl) TO '/home/user/Desktop/result_sql.csv' WITH CSV HEADER;

Note: The folder must be writable.

Comments

5

This worked for me:

COPY (SELECT * FROM table) 
    TO E'C:\\Program Files (x86)\\PostgreSQL\\8.4\\data\\try.csv';

In my case the problem was with the writing permission to a special folder (though I work as administrator), after changing the path to the original data folder under PostgreSQL I had success.

1 Comment

What version of PostgreSQL?
2

Several GUI tools like Squirrel, SQL Workbench/J, AnySQL, ExecuteQuery can export to Excel files.

Most of those tools are listed in the PostgreSQL wiki:

http://wiki.postgresql.org/wiki/Community_Guide_to_PostgreSQL_GUI_Tools

Comments

2

If you have error like "ERROR: could not open server file "/file": Permission denied" you can fix it that:

Ran through the same problem, and this is the solution I found: Create a new folder (for instance, tmp) under /home $ cd /home make postgres the owner of that folder $ chown -R postgres:postgres tmp copy in tmp the files you want to write into the database, and make sure they also are owned by postgres. That's it. You should be in business after that.

1 Comment

Or you can copy to /tmp. Worked for me.
0

The correct script for postgres (Ubuntu) is:

COPY (SELECT * FROM tbl) TO '/var/lib/postgres/myfile1.csv';

3 Comments

psql -c "COPY (SELECT * FROM tbl) TO '/var/lib/postgres/myfile1.csv';" don't forget to add db, user and password if require. -c flag give you option to run command from ubuntu(linux) terminal.
I want to put quote around my string values. how can i? @Michael
You can try ' ' or "\""

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.