我在将我的 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;
然后我在数据库中的 shell 中键入以下命令
dbname
.
\i script.sql
输出为:
COPY 162
嗯,我的输出查询有 162 行。
所以我的输出表的162行已经复制到shell中了。如何将它们粘贴或移动到 csv 文件?
或者,如果我要使用 filename.csv(附上截图),我该如何修复该 csv/Excel 文件的格式?
大多数以前的答案都是正确的,这里有更多细节并且只适用于 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
提示:请注意您可用的可用磁盘空间,如果您执行 select * from your_table 如果表很大,则可能会用完空间。
首先将您的连接信息复制到 ~/.pgpass 和
cat ip:port:dbname:user:pass > ~/.pgpass
chmod 0600 ~/.pgpass
psql -h serverip -U userid dbname -af test.sql | gzip > result.txt.gz
有点切线,还有另一种方式。
我在 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 批处理命令来处理每一行。如果你真的想要一个 CSV 文件,你需要做的就是:-
ECHO table_schema,table_name > %dumpDir%\tables.csv
FOR /F "delims=|" %%p in (%dumpDir%\tables.txt) DO echo %%p,%%q >> %dumpDir%\tables.csv
可能不是最有效的机制,但在少量输出行上工作良好。