PostgreSQL如何使用COPY命令导入文件名含空格的CSV文件?
PostgreSQL COPY导入带空格文件名CSV的解决方案
问题原因
你的报错核心来自两个问题:
- SQL单引号包裹的路径中不需要用反斜杠转义空格,你额外加的
\会让PostgreSQL认为文件名本身包含反斜杠,和实际存在的YIELD NAME.csv文件名不匹配,自然提示找不到文件。 - 原生
COPY命令是PostgreSQL服务端进程执行的,你使用docker部署的场景下,需要确认你写的路径是容器内部的路径,且postgres用户拥有该文件的读取权限。
解决方法
方法1:修正路径使用服务端COPY命令
去掉路径中的反斜杠转义符,直接写带空格的文件名即可:
copy cad.yield_name from '/data/cad/base/YIELD NAME.csv' delimiter ',' csv header;
使用该方法需要先确认两个前提:
- 你宿主机存放CSV的目录已经正确挂载到docker容器的
/data/cad/base/路径下 - 容器内的postgres用户对该CSV文件有可读权限,可执行以下命令配置权限:
# 进入postgres容器 docker exec -it 你的postgres容器名称 bash # 给文件授权 chown postgres:postgres /data/cad/base/YIELD NAME.csv
方法2:使用客户端侧\copy命令(更适配docker场景)
根据错误提示的建议,\copy是psql客户端执行的命令,读取的是你执行psql命令的本地(你的MacOS系统)文件,不需要考虑服务端路径挂载、权限问题,写法如下:
\copy cad.yield_name from '/你Mac本地存放文件的实际路径/YIELD NAME.csv' delimiter ',' csv header;
注意事项:
\copy开头不需要加分号,路径不需要转义空格,直接写带空格的文件名即可- 如果是通过psql远程连接docker内的PostgreSQL,用该方法不需要把文件拷贝进容器,直接读取本地路径即可,操作更简单
内容的提问来源于stack exchange,提问作者daydreamer
相关产品推荐
相关产品推荐

