Postgres COPY FROM csv файл - Няма такъв файл или директория

Опитвам се да импортирам (доста голям) .txt файл в таблица geonames в PostgreSQL 9.1. Аз съм в /~ директорията на моя сървър, с файл с име US.txt, поставен в тази директория. Задавам променливата search_path на geochat, името на базата данни, в която работя. След това въвеждам тази заявка:

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 или нещо подобно, или просто трябва да го изтегля от настоящата работна директория?


person nerdenator    schedule 17.05.2013    source източник


Отговори (5)


Няколко погрешни схващания:

1.

Аз съм в /~ директорията на моя сървър

Няма директория /~. Това е или / (главна директория), или ~ (домашна директория на текущия потребител). Освен това е без значение за проблема.

2.

Зададох променливата search_path на geochat, името на базата данни, в която работя

search_path няма нищо общо с името на базата данни. Това е за схеми в текущата база данни. Вероятно трябва да нулирате това.

3.
От вас се изисква да използвате абсолютния път за вашия файл. Както е документирано в ръководството тук:

filename

Абсолютното име на пътя на входния или изходния файл.

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

По подразбиране е табулатор в текстов формат

5.
NULL: Доста необичайно е да използвате действителния низ 'NULL' за стойност NULL. Сигурен ли си?

По подразбиране е \N (обратна наклонена черта-N) в текстов формат и празен низ без кавички във формат CSV.

Моето предположение (след нулиране на search_path - или квалифицирате схемата на името на таблицата):

COPY geonames FROM '/path/to/file/US.txt';
person Erwin Brandstetter    schedule 18.05.2013
comment
Ръководството, което сте свързали за точка 3. всъщност посочва, че относителен път е подходящ за входни файлове: An input file name can be an absolute or relative path postgresql.org/docs/current/interactive/sql-copy.html Въпреки че наистина не изглежда да работи с относителни пътища. - person Risadinha; 08.05.2014

Може би малко късно, но се надявам полезно:

Вместо това използвайте \copy

https://wiki.postgresql.org/wiki/COPY

jvdw

person jvdw    schedule 10.11.2014

Пътищата са относителни към PostgreSQL сървъра, а не към клиента psql.

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

person Masten SG    schedule 13.02.2015
comment
А, благодаря! Това наистина обяснява относителната част! - person Eric Chen; 25.04.2018

Друг вариант е да го прехвърлите от stdin:

cat US.txt | psql -c "copy geonames from STDIN WITH (FORMAT csv);"
person What Would Be Cool    schedule 23.04.2020
comment
Страхотен. Стар персонализиран механизъм за скриптове спря да работи (файлът не е намерен) и това свърши работа, MMD TY - person Gunnar; 21.07.2021

ако изпълнявате командата 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
person bodman    schedule 01.10.2015