Импортированный PostgreSQL файл CSV вызывает синтаксическую ошибку

8

Я пытаюсь импортировать файл CSV в базу данных с помощью команды «COPY»; Тем не менее, я получаю (что кажется распространенным) ошибку, что я должен быть суперпользователем и что я должен использовать вместо этого "\ copy". Однако при использовании \ copy я получаю синтаксическую ошибку:

ERROR:  syntax error at or near "\"
LINE 1: \copy

С помощью каретки, указывающей на «\». Вот мой запрос:

\copy tablename(column2, column3, column4, column5) from '/home/uploads/data.csv' WITH DELIMITER ',' CSV HEADER'

Я пробовал и "копировать" и "\ копировать". Первый дает мне ошибку суперпользователя, второй - синтаксическую ошибку. Есть идеи, как это исправить? сделай так, чтоб это работало?

Я выполняю команду через поле ввода sql myPgAdmin.

Единственный другой вопрос, который у меня есть, касается импорта столбцов через имя таблицы (column2, column3 и т. Д. Это правильный синтаксис для этого?

antjanus
источник

Ответы:

8

\copyявляется командой psql (командной строки) Это не обычная команда SQL.

Вместо этого вам нужно будет использовать COPY (но это требует наличия файла на сервере базы данных)

a_horse_with_no_name
источник
Как бы вы импортировали файлы CSV напрямую через SQL, а не из командной строки?
Антьян
1
@antjanus: вы бы использовали команду COPY, как я уже упоминал (и Адам подробно объяснил)
a_horse_with_no_name
опять же, это требует прав суперпользователя и небезопасно, верно?
Антьянус
4

Пожалуйста, обратитесь к руководству postgres для COPY .

В pgAdmin (или в строке sql, которую вы передаете через скрипт или другое соединение с БД), вы просто используете COPY без префикса "\".

поэтому введите что-то вроде: COPY tablename....

Вы должны убедиться, что у вас есть соответствующие привилегии для запуска команды, поэтому в этом случае вам необходимо иметь возможность войти в базу данных и иметь доступ на запись к «tablename». Postgres также должен иметь возможность доступа к файлу, поэтому путь / home / uploads / должен быть доступен на сервере базы данных, а пользователь postgres должен иметь возможность прочитать файл - проверьте права доступа к файлу и каталогу.

Адам Ф
источник
2

В моей системе 9.1 ошибка, которую я получаю, довольно информативна:

or_examples=> copy comp_table_test from '/tmp/test';
ERROR:  must be superuser to COPY to or from a file
HINT:  Anyone can COPY to stdout or from stdin. psql's \copy command also works for anyone.

Если вы снова внимательно прочитаете подсказку, в ней есть примечания, которые вы можете скопировать со стандартного ввода. Это то, что \ copy в psql на самом деле делает в серверной части. См. Документы по адресу http://www.postgresql.org/docs/8.3/static/sql-copy.html. получения дополнительной информации .

Затем вы можете поместить тело копии в свой запрос или, по крайней мере, так оно и будет работать в psql.

Крис Траверс
источник
1
copy coordina from '/tmp/filename.txt' WITH NULL AS ;

Вот как я это делаю в pgAdmin3. Но внимательно проверяйте права пользователя, иногда права являются проблемой. (пользователь postgres на имя файла.txt / chmod 777)

Мартин
источник
Вы должны быть суперпользователем БД, чтобы сделать это, хотя отсюда и первоначальная жалоба.
Крис Траверс
0

Другой способ - создать представление для запроса sql. Затем используйте команду \ copy.

NinjaLoop
источник
2
Большая экспозиция была бы наиболее полезной.
Майкл Грин,
Как представление помогает при импорте данных?
a_horse_with_no_name