2013-05-17 57 views
9

我想导入(相当大).txt文件到PostgreSQL 9.1中的表geonames。我在我的服务器的目录下,并在该目录中放置一个名为US.txt的文件。我设置了search_path变量geochat,我正在使用的数据库的名称,然后我进入这个查询:Postgres从csv文件复制 - 没有这样的文件或目录

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

一对夫妇的误解:

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无关与数据库的名称。它适用于当前数据库内的模式。你可能需要重置这个。


您需要使用绝对路径为您的文件。作为记录in the manual here

filename

The absolute path name of the input or output file.

4.
分隔符:只有噪音。

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 
相关问题