如何将CSV导入PostgreSQL Docker容器?解决文件不存在报错
解决Docker Postgres容器导入CSV时「No such file or directory」错误
错误原因
你执行的\COPY是psql的元命令,这个命令会让Postgres服务器端尝试读取指定路径的文件。但你的CSV文件在本地主机的/Users/…/目录下,Docker容器拥有独立的文件系统,无法直接访问主机的文件路径,因此报错。
解决方案
方案1:挂载本地文件到容器
修改docker-compose.yml,给db服务添加卷挂载,把本地CSV所在目录映射到容器内部(比如/tmp):
version: '3.8' services: db: image: postgres:13.2-alpine ports: - 5432:5432 environment: POSTGRES_USER: <> POSTGRES_PASSWORD: <> POSTGRES_DB: <> volumes: - /Users/…/:/tmp/ # 本地目录挂载到容器/tmp
重启容器后,执行\COPY时使用容器内的路径:
\COPY rams(ram) FROM '/tmp/rams.csv' WITH (FORMAT CSV) HEADER;
方案2:通过Node/Slonik客户端导入
不要使用psql的\COPY元命令,改用Slonik的copyFrom函数,让Node客户端读取本地文件并发送给Postgres服务器:
const { createPool } = require('slonik'); const fs = require('fs'); const path = require('path'); async function importCsv() { const pool = createPool('postgres://<POSTGRES_USER>:<POSTGRES_PASSWORD>@db:5432/<POSTGRES_DB>'); const csvStream = fs.createReadStream(path.resolve('/Users/…/rams.csv')); await pool.copyFrom( 'rams(ram)', csvStream, { format: 'csv', header: true, } ); await pool.end(); } importCsv();
这种方式无需挂载文件,直接通过客户端传输数据。
方案3:手动复制文件到容器
如果不想修改docker-compose.yml,可以用docker cp命令把文件复制到容器内部:
# 替换<容器名或ID>为你的Postgres容器标识 docker cp /Users/…/rams.csv <容器名或ID>:/tmp/rams.csv
然后进入容器的psql终端,执行:
\COPY rams(ram) FROM '/tmp/rams.csv' WITH (FORMAT CSV) HEADER;
注意事项
- 确保容器内的文件路径对Postgres用户(默认是
postgres)有读取权限 - 使用Slonik时,确认依赖已正确安装,代码中的数据库连接字符串需替换为实际配置
内容的提问来源于stack exchange,提问作者Newbie
相关产品推荐
相关产品推荐

