当我们在 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 服务器所在的位置 - 所以使用文件的绝对路径。)