Postgres COPY FROM csv file-没有这样的文件或目录

ner*_*tor 20 csv postgresql import tsv psql

我正在尝试将一个(相当大的).txt文件导入PostgreSQL 9.1中的表格地名.我在我的服务器的/〜目录中,在该目录中放置了一个名为US.txt的文件.我将search_path变量设置为geochat,我正在使用的数据库的名称.然后我输入此查询:

COPY geonames
FROM 'US.txt',
DELIMITER E'\t',
NULL 'NULL');
Run Code Online (Sandbox Code Playgroud)

然后我收到此错误:

ERROR: could not open file "US.txt" for reading: No such file or directory.
Run Code Online (Sandbox Code Playgroud)

我是否必须首先输入\i US.txt或类似的东西,或者它应该从当前的工作目录中获取它?

小智 16

也许有点晚了,但希望有用:

请改用\ copy

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

jvdw


Erw*_*ter 15

一些误解:

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';
Run Code Online (Sandbox Code Playgroud)

  • 您为第3点链接的手册实际上表明输入文件的相对路径是正确的:`输入文件名可以是绝对路径或相对路径`http://www.postgresql.org/docs/current/interactive/sql -copy.html虽然它似乎不适用于相对路径. (7认同)

小智 5

路径相对于 PostgreSQL 服务器,而不是psql客户端。

假设你正在运行的PostgreSQL 9.4,你可以把US.txt目录/var/lib/postgresql/9.4/main/


Wha*_*ool 5

另一种选择是从标准输入通过管道输入:

cat US.txt | psql -c "copy geonames from STDIN WITH (FORMAT csv);"
Run Code Online (Sandbox Code Playgroud)