Man*_*iri 6 csv postgresql ubuntu-14.04
我在 Ubuntu 14.04 上使用 Postgres,并且一直在尝试将 csv 文件导入到 Postgres 中名为“天气”的表中。我查看了问题Postgres ERROR: Could not open file for read: Permission returned 并尝试使用该\copy命令而不是常规副本,但我仍然遇到相同的Permission Denied错误。
我有点犹豫是否要修改所有用户该目录的所有文件的所有权权限(如第一个答案中所建议的)。这是复制声明:
\copy weather from '/home/user1/Dropbox/Development/Databases/SQL/Codeschool/TrySQL/temp_data.csv' HEADER DELIMITER ',' CSV
Run Code Online (Sandbox Code Playgroud)
这是终端的屏幕截图:
为什么\copy这里不起作用?
NOTES 的 pg文档 说
该路径将相对于服务器进程的工作目录(通常是集群的数据目录)而不是客户端的工作目录进行解释。
因此,一般来说,使用psql任何客户端,即使在本地服务器中,也会遇到问题......而且,如果您为其他用户表达 COPY 命令,例如。在 Github README 中,读者会遇到问题......
表达具有客户端权限的相对路径的唯一方法是使用STDIN,
当指定 STDIN 或 STDOUT 时,数据通过客户端和服务器之间的连接传输。
正如这里所记得的:
psql -h remotehost -d remote_mydb -U myuser -c \
"copy mytable from STDIN with delimiter as ','" \
< ./relative_path/file.csv
Run Code Online (Sandbox Code Playgroud)
您肯定必须更改一些权限,因为 Postgres 无法读取您的文件。Postgres 与您是不同的用户,因此如果您不授予它权限,它就无法读取您的文件。仅当您的设置是您(而不是 postgres)是运行该命令的用户时, \copy 解决方案才有效psql。
您始终可以制作该文件的副本,将该文件的权限分配给 Postgres 可以执行的目录中的用户 Postgres,然后删除该文件,或者您可以这样做:
您必须更改的内容取决于此命令的输出(以 user1 身份运行):
namei -l /home/user1/Dropbox/Development/Databases/SQL/Codeschool/TrySQL/temp_data.csv
Run Code Online (Sandbox Code Playgroud)
sudo apt-get install util-linux(如果尚未安装,您可能需要在运行此命令之前进行)
该命令将列出文件及其所有父目录的当前权限,以便我们找到解决方案。
假设所有目录都有以“x”结尾的条目,如下所示:
drwxr-xr-x user group filename
drwxr-xr-x
drwxr-xr-x
-rw-------
Run Code Online (Sandbox Code Playgroud)
那么下面的两个解决方案中的任何一个都可以工作。
如果您不想更改所有用户的权限并且您拥有 sudoer 权限,您可以这样做
sudo chown /home/user1/Dropbox/Development/Databases/SQL/Codeschool/TrySQL/temp_data.csv postgresql
Run Code Online (Sandbox Code Playgroud)
但是,这种方法将撤销您对该文件的访问权限,这可能是您不想要的。但在完成导入后,您始终可以将文件 chown 返回给您
sudo chown /home/user1/Dropbox/Development/Databases/SQL/Codeschool/TrySQL/temp_data.csv user1
Run Code Online (Sandbox Code Playgroud)如果您不介意所有用户都读取您的文件,那么您可以执行(作为 user1 并且没有 root 权限)
chmod a+r /home/user1/Dropbox/Development/Databases/SQL/Codeschool/TrySQL/temp_data.csv
Run Code Online (Sandbox Code Playgroud)
我建议您执行此解决方案。它只会更改该文件的权限,以便您计算机上的所有用户都可以读取该文件。然而,尽管默认情况下,Linux 中的大多数目录都可以由任何人打开,但如果并非所有用户都对您的目录具有执行权限,则有可能无法正常工作。
当然,一旦您阅读了该文件,您随时可以再次限制权限
chmod a-r /home/user1/Dropbox/Development/Databases/SQL/Codeschool/TrySQL/temp_data.csv
Run Code Online (Sandbox Code Playgroud)
如果这些解决方案都不适合您,请对上面第一个命令的输出进行评论。