0
lease=# COPY dhcpd_data (ip_address, start_time, end_time, mac_address, machine_name) FROM '~/outputcsvre.csv' DELIMITER ',' CSV HEADER;
ERROR:  could not open file "~/outputcsvre.csv" for reading: No such file or directory

如果我将路径定义为'/home/rihiraj12/outputcsvre.csv',它工作正常。

4

2 回答 2

1

是的,这很正常。

您实际上并没有一个名为~. 当您在命令行上执行命令时,shell 会在运行程序之前~展开。/home/rihiraj12但是在这里你没有使用 shell,所以按~字面意思解释。

作为一种解决方法,你可以说

COPY dhcpd_data (...) FROM PROGRAM 'cat ~/outputcsvre.csv' ...

但请注意,该COPY命令是由服务器执行的,因此这将使服务器产生一个cat命令并使用 PostgreSQL 服务器的主目录。

要从您自己的角度指定文件,您可以(在 psql 中)使用\copy元命令(其语法与 相同COPY):

\copy dhcpd_data (...) FROM PROGRAM 'cat ~/outputcsvre.csv' ...

这将使用您自己的主目录作为~.

于 2018-10-19T07:28:54.910 回答
1

~是类 unix shell 可以扩展为用户主目录的快捷方式。即,如果您使用~/outputcsvre.csv,shell 会在对其/home/rihiraj12/outputcsvre.csv进行任何其他操作之前将其转换为。

在 shell 之外,应用程序很少实现这种扩展 - postgresql 也没有,因此您必须提供文件的真实路径。

对于 postgresql 中的 COPY 命令,它由服务器执行 - 因此在这种情况下,您必须提供服务器可以解析和直接读取的文件名。(即相对路径将相对于 postgresql 服务器所在的位置 - 所以使用文件的绝对路径。)

于 2018-10-19T07:29:41.707 回答