Статьи

Подробнее о буферизации запросов и результатов в psql

В недавнем сообщении блога « Запросы SPOOLing с результатами в psql» я кратко рассмотрел некоторые метакоманды и параметры psql базы данных PostgreSQL, которые можно использовать для эмуляции поведения спулинга SQL * Plus базы данных Oracle . В этом посте я написал: «Мне не удалось найти способ … записать запрос и его результаты в файл без необходимости использовать \qecho ». К счастью, после написания этой статьи коллега указал мне на параметр psql --log-file (или -L ).

В документации PostgreSQL psql говорится, что опция --log-file / -L «записывает [s] весь вывод запроса в имя файла , в дополнение к обычному месту назначения вывода». Этот удобный одиночный параметр выводит как запрос, так и результаты, не связанные с ошибками, в указанный файл. Например, если я запускаю psql с помощью команды « psql -U postgres -LC:\output\albums.txt », а затем запускаю запрос select * from albums; psql -U postgres -LC:\output\albums.txt select * from albums; сгенерированный файл C:\output\albums.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
28
29
30
********* QUERY **********
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)

Один недостаток при использовании -L состоит в том, что любые сообщения об ошибках не записываются в файл, в который записываются запросы и успешные результаты. Следующий снимок экрана демонстрирует ошибку, вызванную запросом по имени столбца, а не по имени таблицы, а список после снимка экрана показывает, что отображается в выходном файле.

20160910-errornottablename-PSQL

1
2
3
********* QUERY **********
select * from artist;
**************************

Выходной файл, сгенерированный с помощью опции -L psql показывает неверный запрос, но сгенерированный файл не содержит сообщения об ошибке, которое было показано в терминальном приложении psql («ОШИБКА: отношение« исполнитель »не существует»). Я не знаю ни одного способа легко гарантировать, что это сообщение об ошибке будет записано в тот же файл, в который записан запрос. Перенаправление стандартного вывода и стандартной ошибки возможно, но тогда мне нужно будет перенаправить сообщения об ошибках в файл, отличный от файла, в который записываются запрос и вывод, на основе имени файла, указанного в опции -L .