ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

PostgreSQL psql 实战:用 \g 元命令把查询结果写入文件

PostgreSQL psql 实战:用 \g 元命令把查询结果写入文件 文档教程知识库【免费下载链接】til:memo: Today I Learned项目地址https://gitcode.com/gh_mirrors/ti/til点击查看免费下载在 psql 交互式会话中绝大多数查询语句都以分号;结尾来提交执行。其实 psql 还提供了一种更灵活的替代写法以\g元命令作为语句终止符它同样会把 SQL 发送给 PostgreSQL 服务器执行并且支持把查询结果直接落盘到指定文件而不是打印到终端。本文基于 til 仓库的 write-a-query-result-to-file.md 整理完整讲解\g的两种用法、与分号提交方式的区别并结合仓库内 psql 相关文档给出导出 CSV、配合EXPLAIN等实战组合读完即可在真实会话中把任何查询结果持久化到文件。分号之外的另一种语句终止符\gpsql 是一个交互式命令行工具它把用户输入的 SQL 语句累积到内部缓冲区query buffer中直到遇到语句终止符才一次性发送给 PostgreSQL 服务器执行。最常见的终止符是分号;但 psql 同样认可\g元命令select 1 \g上面这条语句会正常执行输出如下开启\timing时会附带执行耗时?column? ---------- 1 (1 row)\g与分号的区别在于分号只是“结束并发送”这一件事而\g在完成同样的发送动作之外还额外支持“把结果重定向到文件”。如果\g后面不带任何参数它的行为与分号完全一致——结果照常输出到会话中一旦在后面跟上一个文件名结果就会被写入该文件。这意味着你可以在一个命令里同时完成“执行查询”和“保存结果”两件事而无需先执行、再通过其他工具截取输出。这一特性尤其适合以下场景想把某条临时查询的结果留档供后续查看或交给同事想将查询结果作为其他脚本的输入让输出走文件而不是终端查询结果较多时避免刷屏关于输出较长时 psql 的分页行为可参考 toggling-the-pager-in-psql.md 中的\pset pager off说明。把查询结果写入文件\g filename在\g后面直接写上文件名查询结果就会被写入该文件 select 1, 2, 3 \g query_result.txt执行后终端不会打印查询结果本身从上面的输出可以看出没有出现数据行结果被写入当前工作目录下的query_result.txt。随后可以在 psql 内部用\!转义命令调用 shell 的cat来查看文件内容 \! cat query_result.txt ?column? | ?column? | ?column? ------------------------------ 1 | 2 | 3 (1 row)\!是 psql 的 shell 转义元命令它把后续的命令字符串交给操作系统的 shell 执行因此在会话里就能直接cat、less或wc -l检查刚生成的文件无需退出 psql。上面示例中的Time: 4.293 ms属于会话的\timing输出它仍打印在终端上并不会被写进query_result.txt。\g 与 \o、COPY 等文件输出方案的对比psql 中把查询输出导向文件并非只有\g一条路理解它们的差异有助于按需选择方式语法特点\g filenameselect ... \g filename单条语句执行后将结果写入文件与会话输出格式一致含列名、分隔线、行数统计等人类可读排版\o filename\o filename后再执行语句会话级输出重定向开关后续所有查询结果都持续写入同一文件直到\o恢复终端输出COPY ... TOcopy (select ...) to /path/file.csv csv;由服务器端执行输出纯数据可指定 CSV 格式对权限有要求详见仓库文档 export-query-results-to-a-csv.md\copy\copy (select ...) to /path/file.csv with csv header;客户端侧执行的 COPY权限要求更低适合普通用户其中\g filename写入的是 psql 默认的排版输出如上例中的?column?列头与(1 row)统计适合快速留档、肉眼阅读而需要机器可读的 CSV 数据时应优先使用 export-query-results-to-a-csv.md 介绍的COPY/\copycopy (select * from pokemons) to /tmp/pokemon_dump.csv csv header;进阶组合保存 EXPLAIN 计划、脚本化落盘\g filename对任意返回结果的语句都生效因此也可以配合EXPLAIN使用把查询计划保存下来反复研究。仓库文档 output-explain-query-plan-in-different-formats.md 展示了EXPLAIN (ANALYZE, FORMAT JSON)这样的多格式输出若再叠加\g即可将计划直接存入文件 explain (analyze, format json) select title from books where created_at now() - 1 year::interval \g plan.json另一种常见做法是把\g与-f结合先在编辑器如 Vim里把完整的SELECT ... \g /tmp/result.txt写成.sql文件再通过psql -f query.sql批量执行即可实现脚本化查询落盘仓库文档 print-the-query-buffer-in-psql.md 中提到的\p元命令也能帮你确认缓冲区中正在编辑的语句内容减少多行粘贴时的出错概率。小结以\g结束一条 SQL与分号等价地将其发送给服务器执行\g filename在发送语句的同时把查询结果以 psql 排版格式写入指定文件会话内可用\! cat filename直接核对文件内容需要纯数据或 CSV 时改用COPY/\copy需要持续重定向时使用\o更多细节可查阅man psql或阅读仓库内 write-a-query-result-to-file.md 原文。赞分享文档教程知识库【免费下载链接】til:memo: Today I Learned项目地址https://gitcode.com/gh_mirrors/ti/til点击查看免费下载相关推荐SeaweedFS PostgreSQL 协议接入实战用 psql、JDBC、psycopg2 与 BI 工具直接查询 MQ 数据SeaweedFS PostgreSQL 协议接入实战用 psql、JDBC、psycopg2 与 BI 工具直接查询 MQ 数据 本篇指南基于 postgr分布式文件系统对象存储存储如何用 lz4 --sparse 把解压结果写入稀疏文件如何用 lz4 sparse 把解压结果写入稀疏文件 当 .lz4 压缩包里含有大段连续零字节的数据例如磁盘镜像、备份数据时直接解压会让输出文件按名义大存储系统编程beets limit 插件详解用 lslimit 命令与 n 查询前缀截取查询结果beets limit 插件详解用 lslimit 命令与 n 查询前缀截取查询结果 beets 的 limit 插件用于把一次查询的结果截断为前 N 条音频CLI上一篇Macropodus完全指南一站式掌握中文NLP工具的安装与核心功能下一篇降维算法应用The Algorithms Java特征提取技术创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表