Оператор COPY в PostgreSQL

Используя оператор COPY PostgreSQL, мы можем загрузить данные из текстового файла в таблицу базы данных, как показано ниже:

COPY CME_ERROR_CODES FROM E'C:\\Program Files\\ERROR_CODES\\errcodes.txt' DELIMITER AS '~'

Вышеприведенный оператор запускается с компьютера, на котором установлен клиент postgresql, а сервер находится на другом компьютере с Windows. Запуск вышеприведенного заявления жалуется мне, что ERROR: could not open file "C:\Program Files\ERROR_CODES\errcodes.txt" for reading: No such file or directory,

После некоторых исследований я заметил, что COPY оператор ищет файл загрузчика (errcodes.txt) на компьютере сервера postgresql по тому же пути (C:\Program Files\ERROR_CODES). Чтобы проверить это, я создал ту же структуру папок на компьютере сервера postgresql и сохранил там файл errcodes.txt. Тогда заявление COPY сработало хорошо. Это выглядит очень жестким ограничением для меня с заявлением COPY. Есть ли какие-либо настройки, необходимые, чтобы избежать этого? или это поведение оператора COPY? Я не нашел никакой информации о документах PostgreSQL.

2 ответа

Решение

Вот стандартное решение:

COPY foo (i, j, k) FROM stdin;
1<TAB>2<TAB>3
\.

Данные должны быть правильно экранированы и разделены табуляцией.

На самом деле, это в документах, даже в определении грамматики у вас есть STDIN... См.: http://www.postgresql.org/docs/9.1/static/sql-copy.html

Если вы используете какой-либо язык программирования с поддержкой COPY, у вас будет pg_putcopy или аналогичная функция. Так что вам не нужно беспокоиться о побеге и объединении.

Подсказки, как сделать это вручную в Python -> Создание Postgres COPY непосредственно в Python?

Путь Perl -> http://search.cpan.org/dist/DBD-Pg/Pg.pm#COPY_support

Надеюсь это поможет.

Из документации

Цитата: COPY с именем файла указывает серверу PostgreSQL непосредственно читать или записывать в файл. Файл должен быть доступен для сервера, а имя должно быть указано с точки зрения сервера. Когда указано STDIN или STDOUT, данные передаются через соединение между клиентом и сервером.

Если вы хотите скопировать файл с локального компьютера на сервер, используйте команду \copy.

Другие вопросы по тегам