将查询结果作为 CSV 文件从 Docker PostgreSQL 容器导出到本地计算机

Export Query Result as CSV file from Docker PostgreSQL container to local machine

我不确定这是否可行,如果我做错了什么,因为我对 Docker 还是很陌生。基本上,我想将 PostgreSQL docker 容器中的查询结果作为 csv 文件导出到我的本地机器。

这就是我到目前为止的进展。首先,我 运行 我的 PostgreSQL docker 容器用这个命令:

sudo docker run --rm --name pg-docker -e POSTGRES_PASSWORD=something -d -p 5432:5432 -v $HOME/docker/volumes/postgres:/var/lib/postgresql/data postgres

然后我使用 docker exec 访问 docker 容器到 运行 PostgreSQL 命令,该命令会将查询结果复制到具有指定位置的 csv 文件,如下所示:

\copy (select id,value from test) to 'test_1.csv' with csv;

我认为应该将查询结果导出为本地计算机中名为 test_1.csv 的 csv 文件,但我在本地计算机的任何地方都找不到该文件,还检查了这两个目录:$HOME/docker/volumes/postgres; /var/lib/postgresql/data postgres

您可以将数据导出到 STDOUT 并将结果通过管道传输到客户端计算机中的文件:

docker exec -it -u database_user_name container_name \
psql -d database_name -c "COPY (SELECT * FROM table) TO STDOUT CSV" > output.csv

-c 告诉 psql 你在建立连接时执行给定的 SQL 语句。

所以你的命令应该是这样的:

docker exec -it -u postgres pgdocker \
psql -d yourdb -c "COPY (SELECT * FROM test) TO STDOUT CSV" > test_1.csv

/var/lib/postgresql/data 目录是数据库服务器存储其数据文件的地方。它不是用户需要直接操作或找不到任何有趣内容的目录。

test_1.csv这样的路径是相对于工作目录的。当您使用 docker exec 进入 postgres 容器时,默认目录是 /,所以这就是您的文件所在的位置。也可以在运行前用cd切换到另一个目录 psql:

root@b9e5a0572207:/some/other/path# cd /some/other/path/
root@b9e5a0572207:/some/other/path# psql -U postgres

... 或者您可以提供绝对路径:

\copy (select id,value from test) to '/some/other/path/test_1.csv' with csv;

您可以使用 docker cp 将文件从容器传输到主机:

docker cp pg-docker:/some/other/path/test_1.csv /tmp

...或者如果您经常这样做,您可以创建一个卷。