将查询结果以CSV文件的形式从Docker PostgreSQL容器导出到本地



我不确定这是否可能,如果我做错了什么,因为我仍然是很新的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容器时,默认目录是/,因此您的文件应该在这里。您还可以在运行psql之前使用cd切换到另一个目录:

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

…如果你经常这样做,你也可以创建一个卷。