Статьи

SPOOLing Запросы с результатами в psql

SQL * Plus , инструмент командной строки базы данных Oracle , предоставляет команду SPOOL для «сохранения результатов запроса в файле». На следующем снимке экрана показан SPOOL, используемый в SQL * Plus для буферизации списка пользовательских таблиц в файл с именем C:\pdf\output.txt .

20160810-spoolingOracleHRTables

И выполненный запрос, и результаты запроса были output.txt в файл output.txt как показано в следующем листинге этого файла.

SPOOL вывод файла Oracle * Plus в SPOOL SPOOL

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
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 , обеспечивает функциональность, аналогичную SPOOL в SQL * Plus, с мета-командой \ o ( \ out ). Следующий снимок экрана показывает это в действии в psql .

20160810-psqlPgTablesOut

Файл output.txt записанный с помощью output.txt \o psql ‘, показан в следующем листинге.

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

Только сгенерированные в psql результаты запроса содержатся в сгенерированном файле output.txt . Сам запрос, даже более длинный запрос, созданный с помощью \set ECHO_HIDDEN on , не содержится в выводе.

Один из подходов к обеспечению того, чтобы сам запрос выводился с записью результатов запроса в файл, — это использование \qecho для явной записи запроса в буферный файл перед выполнением запроса. Это продемонстрировано на следующем снимке экрана.

20160810-psqlQueryWithMetaQEcho

Использование \qecho вместе с \o помещает сам запрос в записанный файл с результатами запроса, как показано в следующем списке результатов.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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 является то, что он должен использоваться перед \qecho каждого оператора в выходной файл.

Переменная psql ECHO может быть настроена на queries чтобы «все команды SQL отправлялись на сервер [отправлялись] также на стандартный вывод». Это продемонстрировано на следующем снимке экрана.

20160810-psqlEchoQueries

К сожалению, хотя установка переменной psql ECHO для queries приводит к выводу запроса вместе с результатами в окне psql , запрос не записывается в файл с помощью \o . Вместо этого, когда \o используется с ECHO установленным на queries , сам запрос снова распечатывается в окне, а результаты записываются только в указанный файл. Это связано с тем, что, как указано в документации (я добавил акцент ), \o записывает « вывод запроса… в стандартный вывод». Это продемонстрировано на следующем снимке экрана.

20160810-psqlEchoQueriesWithOut

Я не смог найти способ легко использовать команду метаданных \o и записать запрос и результаты в файл, не используя \qecho . Тем не менее, другой подход, который не требует \qecho состоит в том, чтобы запустить не пытаться \qecho вывод файла изнутри psql интерактивном режиме, а вместо этого выполнить внешний входной файл сценария SQL.

Например, если я сделаю входной файл с именем input.sql который состоит только из одной строки с запросом

select * from albums;
Я мог бежать
psql с командой

psql -U postgres --echo-queries < input.txt > outputWithQuery.txt для чтения этого однострочного файла с запросом и записи выходных данных в файл outputWithQuery.txt . Опция --echo-queries работает как --echo-queries \set ECHO queries из psql и при выполнении этой команды успешно генерируется заданный выходной файл с запросом и результатами. Следующий снимок экрана и следующий список кода демонстрируют это.

20160810-psqlExternallyRunEchoQueries

outputWithQuery.txt

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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)

Я не знаю, как точно имитировать написание SQL * Plus запроса с его результатами из SQL * Plus в psql не добавляя \qecho , но передавая входной скрипт в psql с помощью --echo-queries Опция работает очень похоже на вызов и буферизацию скрипта из SQL * Plus.

Ссылка: SPOOLing Запросы с результатами в psql от нашего партнера JCG Дастина Маркса в блоге Inspired by Actual Events .