我正在尝试将一个(相当大的).txt文件导入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
或类似内容,或者它应该从当前工作目录中获取它?
答案 0 :(得分:16)
答案 1 :(得分:13)
一些误解:
<强> 1 强>
我在服务器的/〜目录中
没有目录/~
。它是/
(根目录)或~
(当前用户的主目录)。这也与问题无关。
<强> 2 强>
我将search_path变量设置为geochat,即我正在使用的数据库的名称
search_path
与数据库名称无关。它适用于当前数据库中的 schemas 。你可能需要重置它。
第3 强>
您需要为文件使用绝对路径。记录在案in the manual here:
<强>
filename
强>输入或输出文件的绝对路径名。
<强> 4 强>
DELIMITER:只是噪音。
默认为文本格式的标签字符
<强> 5 强>
NULL:对'NULL'
值使用实际字符串NULL
并不常见。你确定吗?
默认为文本格式的
\N
(反斜杠-N),以及CSV格式的不带引号的空字符串。
我的猜测(重置search_path
后 - 或您对表名进行架构限定):
COPY geonames FROM '/path/to/file/US.txt';
答案 2 :(得分:3)
路径相对于PostgreSQL服务器,而不是psql
客户端。
假设您正在运行PostgreSQL 9.4,您可以将US.txt
放在目录/var/lib/postgresql/9.4/main/
中。
答案 3 :(得分:2)
如果您正在从脚本运行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
答案 4 :(得分:1)
另一种选择是从stdin中将其引入管道:
cat US.txt | psql -c "copy geonames from STDIN WITH (FORMAT csv);"