Оператор 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.