我在将PostgreSQL输出从shell导出到csv文件时遇到问题
我的SQL脚本称为script.sql
。
我在shell中输入以下命令:
psql congress -af script.sql &> filename.csv
但是当我打开filename.csv
文件时,所有列的值都会挤在Excel csv的一列中(参见附页截图)。
然后我尝试了另一种方式。我将script.sql
编辑为:
Copy (Select * From ...) To '/tmp/filename.csv' With CSV;
然后我在数据库dbname
中的shell中输入以下命令。
\i script.sql
输出结果为:
COPY 162
好吧,我的输出查询有162行。
因此我的输出表的162行已经复制到shell中。如何将它们粘贴或移动到csv文件?
或者,如果我要使用filename.csv(附上截图),我该如何修复该csv / Excel文件的格式?
答案 0 :(得分:31)
现代语法:
COPY (SELECT * FROM ...) TO '/tmp/filename.csv' (format CSV);
因此我的输出表的162行已经复制到shell中。怎么样 我可以粘贴或移动到csv文件吗?
结果 CSV文件。使用匹配的分隔符,使用任何电子表格程序打开它。 Per documentation:
默认为文本格式的制表符,CSV格式的逗号
与Patrick commented类似,您可以以类似的方式使用相应的psql元命令\copy
。它写入(并读取)客户端本地的文件,不需要超级用户权限。
在这些相关答案中有更多解释:
答案 1 :(得分:0)
首先将您的连接信息复制到〜/ .pgpass和
cat ip:port:dbname:user:pass > ~/.pgpass
chmod 0600 ~/.pgpass
psql -h serverip -U userid dbname -af test.sql | gzip > result.txt.gz
答案 2 :(得分:0)
在一点切线上,还有另一种方法。
我在Windows批处理脚本中使用以下内容: -
psql.exe -U %cUser% -h %cHost% -p %cPort% -d %cDB% -t -o "%dumpDir%\tables.txt" -A -c "SELECT table_schema, table_name FROM information_schema.tables WHERE table_schema = '%qSchema%';"
诀窍是记住-A选项。它抑制了数据的空白填充。
我这样做是为了避免上面显示的COPY命令的权限错误,因为运行postgress的帐户与运行我的预定批处理文件的帐户没有相同的权限。
这会给我一个给定模式中的表列表,结果如下: -
MYSCHEMA | MYTABLE1
MYSCHEMA | mytable2
然后我使用FOR batch命令处理每一行。如果您真的想要一个CSV文件,那么您需要做的就是: -
ECHO table_schema,table_name > %dumpDir%\tables.csv
FOR /F "delims=|" %%p in (%dumpDir%\tables.txt) DO echo %%p,%%q >> %dumpDir%\tables.csv
可能不是最有效的机制,但在少量输出行上工作正常。
答案 3 :(得分:0)
大多数previos答案是正确的,这里有更多详细信息,仅适用于Linux
1。创建一个类似于my_query.sql的文件
\COPY (select * from some_table) TO '/tmp/some_file.csv' (format CSV);
2。更新数据库和文件路径的变量后,运行以下命令。
psql "host=YOUR_HOST port=YOUR_PORT dbname=YOUR_DB user=YOUR_USER password=YOUR_PASS" -af my_query.sql
提示:如果您从your_table中执行select *,请谨慎使用可用磁盘空间,如果表很大,可能会用完空间。