Импортированный 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 и т. Д. Это правильный синтаксис для этого?

Ответы:


8

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

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


Как бы вы импортировали файлы 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.


2
Большая экспозиция была бы наиболее полезной.
Майкл Грин,

Как представление помогает при импорте данных?
a_horse_with_no_name
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.