当我们在 postgres 中将路径定义为 '~/path/to/csv' 时,没有这样的文件或目录
No such file or directory when we define the path as '~/path/to/csv' in postgres
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 的 shells 可以扩展为您的用户的主目录。
即,如果您使用 ~/outputcsvre.csv
, shell 会将其转换为 /home/rihiraj12/outputcsvre.csv
,然后再对其进行任何其他操作。
在 shell 之外,应用程序很少实现此扩展 - postgresql 也不会,因此您必须提供文件的真实路径。
对于 postgresql 中的 COPY 命令,它是由服务器执行的 - 因此在这种情况下,您必须提供服务器可以直接解析和读取的文件名。 (即相对路径将相对于 postgresql 服务器所在的位置 - 所以使用文件的绝对路径。)
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 的 shells 可以扩展为您的用户的主目录。
即,如果您使用 ~/outputcsvre.csv
, shell 会将其转换为 /home/rihiraj12/outputcsvre.csv
,然后再对其进行任何其他操作。
在 shell 之外,应用程序很少实现此扩展 - postgresql 也不会,因此您必须提供文件的真实路径。
对于 postgresql 中的 COPY 命令,它是由服务器执行的 - 因此在这种情况下,您必须提供服务器可以直接解析和读取的文件名。 (即相对路径将相对于 postgresql 服务器所在的位置 - 所以使用文件的绝对路径。)