22

我正在尝试将(相当大的).txt 文件导入 PostgreSQL 9.1 中的表 geonames 中。我在服务器的 /~ 目录中,在该目录中放置了一个名为 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或类似的东西,还是应该从当前工作目录中获取?

4

5 回答 5

17

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

改用 \copy

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

jvdw

于 2014-11-10T21:12:56.300 回答
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';
于 2013-05-18T15:30:06.527 回答
6

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

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

于 2015-02-13T19:54:40.470 回答
4

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

cat US.txt | psql -c "copy geonames from STDIN WITH (FORMAT csv);"
于 2020-04-23T23:17:10.623 回答
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
于 2015-10-01T09:23:34.557 回答