在psql中对结果进行查询

Oracle数据库的命令行工具SQL * Plus提供了SPOOL命令以“将查询结果存储在文件中”。 下一个屏幕快照显示了SQL * Plus中使用的SPOOL,用于将用户表列表假脱机到名为C:\pdf\output.txt

20160810假脱机OracleHRTables

如该文件的下一个清单所示,已执行的查询和查询的结果都已假脱机到文件output.txt

Oracle的SQL * Plus的SPOOL -ed output.txt

SQL> select table_name from user_tables;

TABLE_NAME                                                                      
------------------------------                                                  
REGIONS                                                                         
LOCATIONS                                                                       
DEPARTMENTS                                                                     
JOBS                                                                            
EMPLOYEES                                                                       
JOB_HISTORY                                                                     
PEOPLE                                                                          
NUMERAL                                                                         
NUMBER_EXAMPLE                                                                  
COUNTRIES                                                                       

10 rows selected.

SQL> spool off

PostgreSQL的命令行工具psql使用\ o\ out元命令提供与SQL * Plus的SPOOL类似的功能。 以下屏幕快照显示了psql正在执行的操作。

20160810-psqlPgTablesOut

通过psql\o元命令编写的output.txt文件显示在下一个清单中。

List of relations
 Schema |  Name  | Type  |  Owner   
--------+--------+-------+----------
 public | albums | table | postgres
(1 row)

在生成的output.txt文件中仅包含在psql中运行的查询结果。 查询本身,甚至是通过在\set ECHO_HIDDEN on使用\set ECHO_HIDDEN on生成的较长查询,都不会包含在输出中。

确保查询本身已输出且查询结果已写入文件的一种方法是使用\qecho元命令在运行查询之前将查询显式写入假脱机文件。 下一个屏幕快照对此进行了演示。

20160810-psqlQueryWithMetaQEcho

\qecho\o结合使用确实会将查询本身与查询结果一起放置在写入的文件中,如下面列出的输出所示。

select * from albums;
           title           |     artist      | year 
---------------------------+-----------------+------
 Back in Black             | AC/DC           | 1980
 Slippery When Wet         | Bon Jovi        | 1986
 Third Stage               | Boston          | 1986
 Hysteria                  | Def Leppard     | 1987
 Some Great Reward         | Depeche Mode    | 1984
 Violator                  | Depeche Mode    | 1990
 Brothers in Arms          | Dire Straits    | 1985
 Rio                       | Duran Duran     | 1982
 Hotel California          | Eagles          | 1976
 Rumours                   | Fleetwood Mac   | 1977
 Kick                      | INXS            | 1987
 Appetite for Destruction  | Guns N' Roses   | 1987
 Thriller                  | Michael Jackson | 1982
 Welcome to the Real World | Mr. Mister      | 1985
 Never Mind                | Nirvana         | 1991
 Please                    | Pet Shop Boys   | 1986
 The Dark Side of the Moon | Pink Floyd      | 1973
 Look Sharp!               | Roxette         | 1988
 Songs from the Big Chair  | Tears for Fears | 1985
 Synchronicity             | The Police      | 1983
 Into the Gap              | Thompson Twins  | 1984
 The Joshua Tree           | U2              | 1987
 1984                      | Van Halen       | 1984
(23 rows)

使用\qecho的主要缺点是必须在将每个语句写入输出文件之前使用它。

可以将psql变量ECHO设置为queries以“将所有发送到服务器的SQL命令也发送到标准输出。” 下一个屏幕快照对此进行了演示。

20160810-psqlEchoQueries

不幸的是,尽管将psql变量ECHO设置为queries会导致查询与psql窗口中的结果一起输出,但是\o元命令不会将查询写入文件。 相反,当将\oECHO设置为ECHO一起queries ,查询本身将再次打印到窗口中,并且仅将结果写入指定的文件。 这是因为,如文档所述(我强调了 ), \o元命令将“查询输出 ...写入标准输出”。 下一个屏幕快照对此进行了演示。

20160810-psqlEchoQueriesWithOut

我还没有找到一种方法来轻松使用\o meta-data命令,并且无需使用\qecho即可将查询及其结果写入文件。 但是,另一种不需要\qecho是运行,而不是尝试以交互方式假脱机从psql内部输出文件,而是从外部执行SQL脚本输入文件。

例如,如果我创建一个名为input.sql的输入文件,该文件仅包含带有查询的一行

select * from albums;
我可以跑步
psql与命令

psql -U postgres --echo-queries < input.txt > outputWithQuery.txt读取带有查询的单行文件,并将输出写入outputWithQuery.txt文件。 --echo-queries选项的工作方式类似于psql\set ECHO queries ,运行此命令可成功生成带有查询和结果的指定输出文件。 下面的屏幕快照和下面的代码清单对此进行了演示。

20160810-psqlExternallyRunEchoQueries

outputWithQuery.txt

select * from albums;
           title           |     artist      | year 
---------------------------+-----------------+------
 Back in Black             | AC/DC           | 1980
 Slippery When Wet         | Bon Jovi        | 1986
 Third Stage               | Boston          | 1986
 Hysteria                  | Def Leppard     | 1987
 Some Great Reward         | Depeche Mode    | 1984
 Violator                  | Depeche Mode    | 1990
 Brothers in Arms          | Dire Straits    | 1985
 Rio                       | Duran Duran     | 1982
 Hotel California          | Eagles          | 1976
 Rumours                   | Fleetwood Mac   | 1977
 Kick                      | INXS            | 1987
 Appetite for Destruction  | Guns N' Roses   | 1987
 Thriller                  | Michael Jackson | 1982
 Welcome to the Real World | Mr. Mister      | 1985
 Never Mind                | Nirvana         | 1991
 Please                    | Pet Shop Boys   | 1986
 The Dark Side of the Moon | Pink Floyd      | 1973
 Look Sharp!               | Roxette         | 1988
 Songs from the Big Chair  | Tears for Fears | 1985
 Synchronicity             | The Police      | 1983
 Into the Gap              | Thompson Twins  | 1984
 The Joshua Tree           | U2              | 1987
 1984                      | Van Halen       | 1984
(23 rows)

我不知道如何在psql SQL * Plus内部完全模仿SQL * Plus的查询及其结果,而无需添加\qecho元命令,而是使用--echo-queries将输入脚本传递给psql option的工作方式与在SQL * Plus中调用和假脱机脚本非常相似。

翻译自: https://www.javacodegeeks.com/2016/08/spooling-queries-results-psql.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值