2013-05-17 8 views
9

Я пытаюсь импортировать (довольно большой) .txt-файл в таблицу geonames в PostgreSQL 9.1. Я в каталоге/~ моего сервера, с файлом US.txt, помещенным в этот каталог. Я поставил search_path переменную geochat, имя базы данных, я работаю тогда, я войти в этот запрос:.Postgres COPY FROM csv file- Нет такого файла или каталога

COPY geonames 
FROM 'US.txt', 
DELIMITER E'\t', 
NULL 'NULL'); 

Затем я получаю эту ошибку:

ERROR: could not open file "US.txt" for reading: No such file or directory. 

Должен ли я набирать в \i US.txt или что-то подобное в первую очередь, или нужно просто получить его из настоящего рабочего каталога?

ответ

9

Несколько заблуждений:

1.

I'm in the /~ directory of my server

Там нет каталога /~. Это либо / (корневой каталог), либо ~ (домашний каталог текущего пользователя). Это также не имеет отношения к проблеме.

2.

I set the search_path variable to geochat, the name of the database I'm working in

search_path не имеет ничего общего с именем базы данных. Это для схемы внутри текущей базы данных. Вероятно, вам нужно сбросить это.

3.
Вы должны использовать абсолютный путь для вашего файла. Как документально in the manual here:

filename

The absolute path name of the input or output file.

4.
DELIMITER: просто шум.

The default is a tab character in text format

5.
NULL: Это довольно редко, чтобы использовать действительную строку 'NULL' для значения NULL. Ты уверен?

The default is \N (backslash-N) in text format, and an unquoted empty string in CSV format.

Моя догадка (после сброса search_path - или вы-схемы квалифицировать имя таблицы):

COPY geonames FROM '/path/to/file/US.txt'; 
+3

Руководство вы связаны для пункта 3 фактически утверждает, что относительный путь нормально для входных файлов: 'имя входного файла может быть абсолютным или относительным путем. http://www.postgresql.org/docs/current/interactive/sql-copy.html Хотя это действительно не работает с относительными путями. – Risadinha

2

Пути относятся к серверу PostgreSQL, а не к клиенту psql.

Предполагая, что вы используете PostgreSQL 9.4, вы можете поместить US.txt в каталог /var/lib/postgresql/9.4/main/.

1

Если вы используете команду COPY из сценария, вы можете иметь шаг в скрипте, который создает команду COPY с правильным абсолютным путем.

MYPWD=$(pwd) 
echo "COPY geonames FROM '$MYPWD/US.txt', DELIMITER E'\t';" 
MYPWD= 

вы можете запустить эту часть в файл и выполнить его

./step_to_create_COPY_with_abs_path.sh >COPY_abs_path.sql 
psql -f COPY_abs_path.sql -d your_db_name 

 Смежные вопросы

  • Нет связанных вопросов^_^