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'
,它工作正常。
是的,这很正常。
您实际上没有一个名为~
的目录。在命令行上执行命令时,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' ...
这将使用您自己的主目录作为~
。
>~
是一个快捷方式,类Unix的shell可以扩展为用户的主目录。 即如果你使用~/outputcsvre.csv
,shell 会在对它做任何其他事情之前将其转换为/home/rihiraj12/outputcsvre.csv
。
在 shell 之外,应用程序很少实现这种扩展 - postgresql 也没有,因此您必须提供文件的真实路径。
对于 postgresql 中的 COPY 命令,它由服务器执行 - 因此在这种情况下,您必须提供服务器可以直接解析和读取的文件名。(即相对路径将相对于PostgreSQL服务器所在的位置 - 因此请使用文件的绝对路径。