如何将 PostgreSQL 查询输出导出到 csv 文件
How to export a PostgreSQL query output to a csv file
我在将我的 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 行。
因此我的输出 table 的 162 行已被复制到 shell 中。如何将它们粘贴或移动到 csv 文件?
或者,如果我要使用 filename.csv(附上屏幕截图),我该如何修复 csv/Excel 文件的格式?
现代语法:
COPY (SELECT * FROM ...) TO '/tmp/filename.csv' (FORMAT csv);
So the 162 rows of my output table have been copied in the shell. How
can I paste or move them to a csv file?
结果是 CSV 文件。使用任何使用匹配分隔符的电子表格程序打开它。 The manual:
The default is a tab character in text format, a comma in CSV format
psql 元命令 \copy
是 SQL COPY
函数的包装器。它写入和读取客户端本地文件(而 COPY
使用服务器本地文件)并且不需要超级用户权限。
参见:
- Export specific rows from a PostgreSQL table as INSERT SQL script
- PostgreSQL: export resulting data from SQL query to Excel/CSV
首先将您的连接信息复制到 ~/.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 选项。它抑制了数据的空白填充。
我这样做是为了避免上面显示的使用帐户 运行 postgress 的 COPY 命令的权限错误与帐户 运行 我的计划批处理文件的权限不同。
这为我提供了给定模式中的表列表,结果如下:-
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
可能不是最有效的机制,但在少量输出行上工作正常。
之前的大部分答案都是正确的,这里有更多详细信息,仅适用于 linux
1.Create 类似 my_query.sql
的文件
\COPY (select * from some_table) TO '/tmp/some_file.csv' (format CSV);
2.Run 在更新数据库和文件路径的变量后执行以下命令。
psql "host=YOUR_HOST port=YOUR_PORT dbname=YOUR_DB user=YOUR_USER password=YOUR_PASS" -af my_query.sql
提示:小心你的可用磁盘 space 如果你从 your_table 执行 select * 你可能 运行 出 space ] 如果有大 table.
我在将我的 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 行。
因此我的输出 table 的 162 行已被复制到 shell 中。如何将它们粘贴或移动到 csv 文件?
或者,如果我要使用 filename.csv(附上屏幕截图),我该如何修复 csv/Excel 文件的格式?
现代语法:
COPY (SELECT * FROM ...) TO '/tmp/filename.csv' (FORMAT csv);
So the 162 rows of my output table have been copied in the shell. How can I paste or move them to a csv file?
结果是 CSV 文件。使用任何使用匹配分隔符的电子表格程序打开它。 The manual:
The default is a tab character in text format, a comma in CSV format
psql 元命令 \copy
是 SQL COPY
函数的包装器。它写入和读取客户端本地文件(而 COPY
使用服务器本地文件)并且不需要超级用户权限。
参见:
- Export specific rows from a PostgreSQL table as INSERT SQL script
- PostgreSQL: export resulting data from SQL query to Excel/CSV
首先将您的连接信息复制到 ~/.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 选项。它抑制了数据的空白填充。
我这样做是为了避免上面显示的使用帐户 运行 postgress 的 COPY 命令的权限错误与帐户 运行 我的计划批处理文件的权限不同。
这为我提供了给定模式中的表列表,结果如下:-
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
可能不是最有效的机制,但在少量输出行上工作正常。
之前的大部分答案都是正确的,这里有更多详细信息,仅适用于 linux
1.Create 类似 my_query.sql
的文件\COPY (select * from some_table) TO '/tmp/some_file.csv' (format CSV);
2.Run 在更新数据库和文件路径的变量后执行以下命令。
psql "host=YOUR_HOST port=YOUR_PORT dbname=YOUR_DB user=YOUR_USER password=YOUR_PASS" -af my_query.sql
提示:小心你的可用磁盘 space 如果你从 your_table 执行 select * 你可能 运行 出 space ] 如果有大 table.