Работа с psql
Рассмотрим возможности интерактивного клиента psql. psql предоставляет богатый набор функций – от простого выполнения запросов до сложного форматирования вывода, работы с переменными и автоматизации задач.
Форматирование вывода
По умолчанию psql выводит результаты запросов в выровненном табличном виде с заголовками столбцов. Но часто требуется изменить формат вывода, например, для последующей обработки другими программами.
Рассмотрим пример с генерацией числового ряда:
postgres=# SELECT min(g.i), max(g.i), avg(g.i) FROM generate_series(0,10) as g(i);
min | max | avg
-----+-----+--------------------
0 | 10 | 5.0000000000000000
(1 row)
Изменим формат вывода:
postgres=# \a \t
Output format is unaligned.
Tuples only is on.
Клиент psql поддерживает различные форматы вывода результатов запроса. Например, можно отключить вывод заголовков – \t, а также отказаться от выравнивания – \a.
Данные метакоманды работают как переключатели. Чтобы вернуть стандартные значения параметров форматирования, следует их выполнить повторно.
Посмотрим на вывод той же команды после изменений:
postgres=# SELECT min(g.i), max(g.i), avg(g.i) FROM generate_series(0,10) as g(i);
0|10|5.0000000000000000
Это не совсем удобно для восприятия информации человеком, но необходимо, если результат запроса перенаправляется в другую программу или файл для последующей обработки.
Посмотреть на все установленные параметры psql, влияющие на форматирование, можно командой \pset:
postgres=# \pset
border 1
columns 0
csv_fieldsep ','
expanded off
fieldsep '|'
fieldsep_zero off
footer on
format aligned
linestyle ascii
null ''
numericlocale off
pager 1
pager_min_lines 0
recordsep '\n'
recordsep_zero off
tableattr
title
tuples_only off
unicode_border_linestyle single
unicode_column_linestyle single
unicode_header_linestyle single
Этой же командой можно детально настроить форматирование (\pset <параметр> <значение>), например, сделать пробел разделителем:
postgres=# \pset fieldsep ' '
Field separator is " ".
postgres=# SELECT min(g.i), max(g.i), avg(g.i) FROM generate_series(0,10) as g(i);
0 10 5.0000000000000000
Для смены разделителя также есть метакоманда \f.
Изменение параметров форматирования, равно и как изменение общих параметров psql командой \set, сохраняется только в рамках запущенного экземпляра psql. После перезапуска psql параметры будут сброшены.
Для постоянного сохранения настроек нужно поместить соответствующие команды в файл .psqlrc, тогда они будут выполняться при каждом запуске программы.
Коротко о главном:
\a— выравнивание;\t— вывод только строк;\f— разделитель полей;\pset— детальная настройка форматирования;- метакоманды форматирования работают как переключатели.
Расширенный вывод
Когда в запросе много столбцов и вывод не помещается по горизонтали, удобно использовать расширенный (вертикальный) вывод.
Чтобы установить расширенный вывод только для одного запроса, нужно вместо завершения команды символом точка с запятой ; указать метакоманду \gx:
postgres=# SELECT min(i), max(i), avg(i) FROM generate_series(0,10) g(i) \gx
-[ RECORD 1 ]-----------
min | 0
max | 10
avg | 5.0000000000000000
Режим расширенного вывода устанавливается метакомандой \x:
postgres=# \x
Expanded display is on.
postgres=# SELECT min(g.i), max(g.i), avg(g.i) FROM generate_series(0,10) as g(i);
-[ RECORD 1 ]-----------
min | 0
max | 10
avg | 5.0000000000000000
Коротко о главном:
\x— переключение в режим расширенного вывода;- Поля строк в расширенном выводе печатаются по вертикали;
\gx— вывести в расширенном режиме результаты одной команды.
Буфер запроса
Последний выполненный запрос сохраняется в специальном буфере psql.
Посмотрим содержимое буфера:
postgres=# \p
SELECT min(g.i), max(g.i), avg(g.i) FROM generate_series(0,10) as g(i)
Выполним запрос из буфера повторно:
postgres=# \g
min | max | avg
----+-----+--------------------
0 | 10 | 5.0000000000000000
(1 row)
Очистим буфер:
postgres=# \r
Query buffer reset (cleared).
Метакоманда \w <файл> сохраняет содержимое буфера в файл.
Коротко о главном:
\p— вывести содержимое буфера;\g— выполнить команду SQL в буфере;\r— стереть содержимое буфера;\w— записать в файл содержимое буфера.
История команд
Клиент psql сохраняет историю выполненных команд. Эта функциональность реализуется библиотекой readline, включенной во множество других программ, например Bash.
Совершенно аналогично Bash, нажатие на клавиши вверх-вниз позволяет просматривать историю выполненных команд, нажатие Ctrl+R позволяет перейти в режим интерактивного поиска выполненной команды по подстроке.
Метакоманда \s выводит список выполненных ранее команд:
postgres=# \s
\set
\? command
\? options
\? variables
По умолчанию в СУБД Pangolin история команд psql не сохраняется между сеансами по соображениям безопасности. Для запоминания истории необходимо включить специальный параметр psql.save_history.
Проверим значение параметра:
postgres=# \dconfig+ psql.save_history
List of configuration parameters
Parameter | Value | Type | Context | Access
-------------------+----------+------+------------+---------------
psql.save_history | off | bool | postmaster |
(1 row)
Для включения параметра необходимо изменить конфигурацию:
postgres=# ALTER SYSTEM SET psql.save_history TO on;
После изменений требуется перезагрузка сервера.
Другой способ изменить параметр — добавить текстовым редактором строку конфигурации в файл postgresql.conf и перезагрузить сервер:
psql.save_history = 'on'
Подробнее о конфигурации смотрите в «Главе 05. Конфигурация сервера».
Коротко о главном:
\s— вывод истории команд, можно записать в файл;- Сканирование команд в истории посредством стрелок вверх-вниз;
Ctrl+R— поиск последней выполненной команды по подстроке;- Включить сохранение истории можно параметром
psql.save_history.
Многократное выполнение буфера
Метакоманда \watch позволяет выполнять запрос из буфера повторно с заданным интервалом:
postgres=# SELECT now();
postgres=# \watch
Mon 16 Mar 2026 01:27:41 PM MSK (every 2s)
now
-------------------------------
2026-03-16 13:27:41.549461+03
(1 row)
Mon 16 Mar 2026 01:27:43 PM MSK (every 2s)
now
-------------------------------
2026-03-16 13:27:43.549496+03
(1 row)
Mon 16 Mar 2026 01:27:45 PM MSK (every 2s)
now
-------------------------------
2026-03-16 13:27:45.549471+03
Запрос будет выполняться каждые 2 секунды до прерывания (Ctrl+C). Можно задавать интервал в секундах \watch i[nterval]=1.
Это полезно для отслеживания хода выполнения сопроводительных операций в представлениях pg_stat_progress_copy, pg_stat_progress_basebackup и других.
Коротко о главном:
\watchмногократно повторяет команду в буфере до тех пор, пока не будет прервана;- Комбинация клавиш
Ctrl+Cпрерывает поток вывода\watch; - по умолчанию повтор каждые две секунды.
Вывод в файл или поток
Результаты запросов можно направлять в файл с помощью команды \o[ut] <файл>:
postgres=# \o time.txt
postgres=# SELECT now();
В psql можно выполнять команды shell метакомандой \!:
postgres=# \! cat time.txt
now
------------------------------
2026-03-16 12:25:25.16045+03
(1 row)
Вернуть вывод в консоль позволяет выполнение метакоманды \o без аргумента.
Также можно перенаправить вывод на вход команде shell \o | <команда>:
postgres=# \o | head -5
postgres=# SELECT * FROM generate_series(1, 10);
generate_series
-----------------
1
2
3
Коротко о главном:
\o[ut] <файл>— перенаправляет весь последующий вывод в файл;\o— возвращает вывод на терминал;\o | <команда_ОС>— перенаправляет поток вывода команде ОС.
Генерация скрипта
Можно формировать SQL-скрипты, перенаправив вывод psql в файл скрипта. Обращение к файлу будет выполняться от имени того пользователя, от которого был запущен psql.
Для начала настроим вывод без выравнивания, без заголовков, с пробелом в качестве разделителя:
postgres=# \a \t \f ' '
Output format is unaligned.
Tuples only is on.
Field separator is " ".
Перенаправим вывод в файл db_sizes.sql:
postgres=# \o db_sizes.sql
Сгенерируем команды для каждой базы данных:
postgres=# SELECT format('SELECT ''%I:'', pg_size_pretty(pg_database_size(''%I''));', datname, datname) FROM pg_database;
Команда SELECT в примере генерирует несколько команд SELECT для получения размеров баз данных.
Если в форматируемом тексте встречаются апострофы вида «'», их следует экранировать повторным символом.
В результате в файле db_sizes.sql окажется:
SELECT 'postgres:', pg_size_pretty(pg_database_size('postgres'));
SELECT 'student:', pg_size_pretty(pg_database_size('student'));
SELECT 'template1:', pg_size_pretty(pg_database_size('template1'));
SELECT 'template0:', pg_size_pretty(pg_database_size('template0'));
Подготовленный скрипт можно выполнить несколькими способами.
Выполнение скрипта из файла
Записанные в файл команды можно выполнить из командной строки с помощью psql -f файл или psql < файл:
[postgres@ServerName ~]$ psql -AtF ' ' -f db_sizes.sql
postgres: 9151 kB
student: 9535 kB
template1: 9239 kB
template0: 8945 kB
А -AtF ' ' это что?
Это уже знакомое форматирование:
-A– отключить выравнивание (аналог\a);-t– только строки (аналог\t);-F ' '– установить разделитель полей (аналог\f).
Выполнение скрипта в psql
В интерактивном режиме команды psql выполнить команды из скритпа SQL позволяет метакоманда \i <файл>.
Для начала изменим формат:
postgres=# \a \t \f ' '
Output format is unaligned.
Tuples only is on.
Field separator is " ".
Выполним записанные в файл команды:
postgres=# \i db_sizes.sql
postgres: 9151 kB
student: 9535 kB
template1: 9239 kB
template0: 8945 kB
Переменные psql
По аналогии с shell, psql имеет собственные переменные, среди которых есть ряд встроенных (выступающих в качестве параметров psql, определяющих его поведение).
Как и с переменными shell, принято, что системные переменные названы в верхнем регистре (хотя это всего лишь соглашение). Посмотреть список переменных psql можно командой \set без аргументов:
postgres=# \set
AUTOCOMMIT = 'on'
COMP_KEYWORD_CASE = 'preserve-upper'
...
Создать собственную переменную и присвоить ей значение можно с помощью команды \set <переменная> <значение>:
postgres=# \set myVar Привет!
postgres=# \echo :myVar
Привет!
У переменных psql нет возможности задать тип данных, все значения хранятся как текстовые строки.
Коротко о главном:
\setвыводит список переменных psql или устанавливает их;- некоторые переменные, например
AUTOCOMMIT, влияют на поведение самого psql; \echo— вывод на терминал или в поток;- для извлечения значения переменной перед именем ставят двоеточие.
Взаимодействие с ОС
В переменную psql можно записать результат выполнения команды shell, для этого команду shell необходимо написать в открывающих кавычках:
postgres=# \set osDate `date`
postgres=# \echo :osDate
Mon Mar 16 02:43:12 PM MSK 2026
Будет запущена порожденная оболочка (subshell), в которой будет выполнена написанная команда, а результат ее выполнения будет записан в переменную psql.
Если результат shell-команды не требуется сохранять, то можно воспользоваться \! <команда>. При этом результат команды будет отправлен на экран:
postgres=# \! date
Mon Mar 16 02:39:45 PM MSK 2026
Коротко о главном:
- Команда в открывающих кавычках
командавыполняется в ОС, результат возвращается вpsql; \!выполняет команду ОС.
Переменные окружения
Чтобы использовать в сеансе psql значение переменной из ОС, нужно считать его в переменную psql. Для этого применяется метакоманда \getenv <переменная> <переменная окружения>.
Создадим переменную psql osUser со значение переменной окружения USER:
postgres=# \getenv osUser USER
Ранее была создана переменная myVar. Выведем значение обеих переменных:
postgres=# \echo :myVar :osUser
Привет! student
Сбросить переменную можно так:
postgres=# \unset osUser
Назначить значение переменной окружения непосредственно из psql можно метакомандой \setenv. При этом следует понимать, что переменные окружения не являются аналогами глобальных переменных в универсальных языках программирования. Окружение процесса, состоящее в том числе и из переменных, копируется в окружение дочерних процессов и никак иначе.
Поэтому использование \setenv уместно лишь для того, чтобы установить переменную окружения, влияющую на сам процесс psql.
Например, установим программу для постраничного просмотра и ее опции:
postgres=# \setenv PAGER less
postgres=# \setenv LESS -XS
Переменная PAGER указывает, что для постраничного просмотра будет использоваться программа less. Переменная LESS передает less опции -X (не очищать экран при выходе) и -S (не переносить длинные строки).
postgres=# \! echo $PAGER
less
postgres=# \! echo $LESS
-XS
Удалить созданные переменные окружения можно так:
postgres=# \setenv PAGER
postgres=# \setenv LESS
Коротко о главном:
- команда
\getenvсчитывает в ОС значение переменной окружения и записывает в переменную psql; - удалить переменную psql –
\unset; - команда
\setenvустанавливает переменную окружения; - удалить переменную окружения –
\setenv <переменная_окружения>.
Файл ресурсов .psqlrc
При запуске psql выполняются два скрипта (при их наличии). Сначала общий системный скрипт psqlrc, затем пользовательский файл .psqlrc. По умолчанию оба файла отсутствуют.
Пользовательский файл должен располагаться в домашнем каталоге пользователя, запустившего psql, а расположение системного скрипта можно узнать при помощи утилиты pg_config:
[postgres@ServerName ~]$ pg_config --sysconfdir
/usr/pangolin-{major.minor}/etc
Обычное применение этих файлов заключается в выполнении SQL-команд, которые автоматически должны срабатывать при входе в сеанс. Также часто настраивают значения переменных psql, например, задавая приглашение командной строки.
Настройка приглашения
Приглашение командной строки в psql настраивается через три переменные:
PROMPT1— обычное приглашения перед началом ввода команды;PROMPT2— приглашение при продолжении ввода команды (послеEnterбез;);PROMPT3— приглашение при вводе данных для командыCOPY.
Посмотрим на приглашение, которое стоит по умолчанию:
postgres=# \echo :PROMPT1
%/%R%x%#
Разбор спецсимволов:
-
%/— имя текущей базы данных; -
%R— текущий режим:=— готовность ввода команды;-— продолжение ввода команды;'— вводится литерал;
-
%x— статус транзакции; -
%#— для суперпользователя –#, для остальных –>.
Итоги
- Интерактивная оболочка
psqlпредоставляет возможности редактирования и исполнения команд SQL; - Клиент
psqlможет гибко настраиваться с помощью собственных переменных и переменных окружения; - Можно использовать файл настройки ресурсов.