psql
Выполнение команд SQL:
=> select schemaname, tablename, tableowner from pg_tables limit 10;
schemaname | tablename | tableowner
------------+-----------------+------------
pg_catalog | pg_statistic | postgres
pg_catalog | pg_type | postgres
pg_catalog | pg_authid | postgres
pg_catalog | pg_attribute | postgres
pg_catalog | pg_proc | postgres
pg_catalog | pg_user_mapping | postgres
pg_catalog | pg_attrdef | postgres
pg_catalog | pg_constraint | postgres
pg_catalog | pg_index | postgres
pg_catalog | pg_operator | postgres
(10 rows)
-----------------------------------------------------------------------
Команда SQL может занимать и несколько строк,
точка с запятой завершает ее.
=> select schemaname, tablename, tableowner
=> from pg_tables limit 10;
schemaname | tablename | tableowner
------------+-----------------+------------
pg_catalog | pg_statistic | postgres
pg_catalog | pg_type | postgres
pg_catalog | pg_authid | postgres
pg_catalog | pg_attribute | postgres
pg_catalog | pg_proc | postgres
pg_catalog | pg_user_mapping | postgres
pg_catalog | pg_attrdef | postgres
pg_catalog | pg_constraint | postgres
pg_catalog | pg_index | postgres
pg_catalog | pg_operator | postgres
(10 rows)
-----------------------------------------------------------------------
Если вывод команды SQL не помещется на экран, для его отображения можно использовать
специальную программу $PAGER.
Использование можно включать или выключать с помощью \pset pager on|off
-----------------------------------------------------------------------
Для управления выводом используется команда \pset в разных вариациях.
Например, можно включить отображение полей "в столбик":
\pset expanded on|off
или просто \x
=> \pset expanded on
Expanded display is on.
=> select schemaname, tablename, tableowner from pg_tables limit 2;
-[ RECORD 1 ]------------
schemaname | pg_catalog
tablename | pg_statistic
tableowner | postgres
-[ RECORD 2 ]------------
schemaname | pg_catalog
tablename | pg_type
tableowner | postgres
=> \pset expanded off
Expanded display is off.
-----------------------------------------------------------------------
Если вывод предстоит разбирать программно, то можно:
а) убрать выравнивание полей
=> \pset format unaligned
Output format is unaligned.
б) убрать вывод заголовка таблицы
=> \pset tuples_only on
Tuples only is on.
в) заменить разделитель
=> \pset fieldsep ' '
Field separator is " ".
-----------------------------------------------------------------------
Посмотрим на результат:
=> select schemaname, tablename, tableowner from pg_tables limit 10;
pg_catalog pg_statistic postgres
pg_catalog pg_type postgres
pg_catalog pg_authid postgres
pg_catalog pg_attribute postgres
pg_catalog pg_proc postgres
pg_catalog pg_user_mapping postgres
pg_catalog pg_attrdef postgres
pg_catalog pg_constraint postgres
pg_catalog pg_index postgres
pg_catalog pg_operator postgres
...и вернем обратно:
=> \pset format aligned
Output format is aligned.
=> \pset tuples_only off
Tuples only is off.
-----------------------------------------------------------------------
Можно включить формат вывода HTML:
=> \pset format html
Output format is html.
=> select schemaname, tablename, tableowner from pg_tables limit 1;
schemaname |
tablename |
tableowner |
pg_catalog |
pg_statistic |
postgres |
(1 row)
=> \pset format aligned
Output format is aligned.
-----------------------------------------------------------------------
Можно выполнять команды shell:
=> \! ls | head -n 10
dba1_04_psql.sh
dba1_05_databases.sh
dba1_06_tablespaces.sh
dba1_07_system_catalog.sh
dba1_08_objects.sh
dba1_11_privileges.sh
dba1_12_configuration.sh
dba1_14_monitoring.sh
dba1_16_logical_backup.sh
dba1_17_physical_backup.sh
=> \! pwd
/home/student/dba1/practice
-----------------------------------------------------------------------
Для изменения текущего (для psql) каталога есть специальная команда:
=> \! pwd
/home/student/dba1/practice
=> \cd ..
=> \! pwd
/home/student/dba1
=> \cd practice
-----------------------------------------------------------------------
Можно установить переменную окружения:
=> \! echo $TEST
=> \setenv TEST Hello
=> \! echo $TEST
Hello
-----------------------------------------------------------------------
Можно записать вывод команды в файл с помощью \o[ut]:
=> \o dba1_log
=> select schemaname, tablename, tableowner from pg_tables limit 5;
На экран ничего не попало. Посмотрим в файле:
=> \! cat dba1_log
schemaname | tablename | tableowner
------------+--------------+------------
pg_catalog | pg_statistic | postgres
pg_catalog | pg_type | postgres
pg_catalog | pg_authid | postgres
pg_catalog | pg_attribute | postgres
pg_catalog | pg_proc | postgres
(5 rows)
Вернем вывод на экран:
=> \o
-----------------------------------------------------------------------
Запишем в файл команды SQL.
=> \a
Output format is unaligned.
=> \t
Tuples only is on.
=> \pset fieldsep ' '
Field separator is " ".
=> \o dba1_log
=> select 'select count(*) from', tablename, ';' from pg_tables limit 3;
=> \o
=> \t
Tuples only is off.
=> \a
Output format is aligned.
-----------------------------------------------------------------------
Вот что получилось в файле:
=> \! cat dba1_log
select count(*) from pg_statistic ;
select count(*) from pg_type ;
select count(*) from pg_authid ;
-----------------------------------------------------------------------
И выполним теперь эти команды с помощью \i[nclude]:
=> \i dba1_log
count
-------
399
(1 row)
count
-------
339
(1 row)
count
-------
8
(1 row)
-----------------------------------------------------------------------
Другие способы выполнить команды из файла:
а) psql < filename
б) psql -f filename
в) psql -c command (работает только для одной команды)
Файл также можно отредактировать, не выходя из psql, с помощью \e[dit] filename,
при этом используется редактор $PSQL_EDITOR (или $EDITOR, или $VISUAL)
-----------------------------------------------------------------------
Последняя команда SQL попадает в буфер запроса.
Выполним команду и выведем содержимое буфера с помощью \p[rint]:
=> select now();
now
-------------------------------
2016-06-16 17:23:08.364833+03
(1 row)
=> \p
select now();
Выполним команду, не вводя ее заново (в остальном \g аналогична точке с запятой):
=> \g
now
-------------------------------
2016-06-16 17:23:08.372176+03
(1 row)
-----------------------------------------------------------------------
Можно записать содержимое буфера в файл с помощью \w[rite]:
=> \w dba1_log
=> \! cat dba1_log
select now();
Наконец, очистим буфер с помощью \r[eset]:
=> \r
Query buffer reset (cleared).
=> \p
Query buffer is empty.
-----------------------------------------------------------------------
Можно периодически выполнять команду из буфера с помощью \watch seconds
Буфер также можно отредактировать с помощью \e[dit],
после чего отредактированная команда выполнится.
-----------------------------------------------------------------------
По аналогии с shell, psql имеет собственные переменные,
среди которых есть ряд встроенных (имеющих определенный смысл для psql).
Установим переменную:
=> \set TEST Hi!
Чтобы получить значение, надо предварить имя переменной двоеточием:
=> \echo :TEST
Hi!
Значение переменной можно сбросить:
=> \unset TEST
=> \echo :TEST
:TEST
-----------------------------------------------------------------------
Можно установить значение переменной результатом запроса с помощью \gset вместо точки с запятой:
=> select now() as curr_time \gset
=> \echo :curr_time
2016-06-16 17:23:08.404983+03
Значение переменной можно запросить и у пользователя с помощью \prompt text name
А также указать при запуске: psql -v name=value
-----------------------------------------------------------------------
Без параметров \set выдает значения всех переменных:
=> \set
AUTOCOMMIT = 'on'
PROMPT1 = '%/%R%# '
PROMPT2 = '%/%R%# '
PROMPT3 = '>> '
VERBOSITY = 'default'
VERSION = 'PostgreSQL 9.4.8 on i686-pc-linux-gnu, compiled by gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4, 32-bit'
HISTFILE = 'hist'
DBNAME = 'postgres'
USER = 'postgres'
PORT = '5432'
ENCODING = 'UTF8'
curr_time = '2016-06-16 17:23:08.404983+03'
-----------------------------------------------------------------------
С помощью серии команд, начинающихся на \d, можно смотреть информацию об объектах БД.
Например:
=> \d+ pg_rules
View "pg_catalog.pg_rules"
Column | Type | Modifiers | Storage | Description
------------+------+-----------+----------+-------------
schemaname | name | | plain |
tablename | name | | plain |
rulename | name | | plain |
definition | text | | extended |
View definition:
SELECT n.nspname AS schemaname,
c.relname AS tablename,
r.rulename,
pg_get_ruledef(r.oid) AS definition
FROM pg_rewrite r
JOIN pg_class c ON c.oid = r.ev_class
LEFT JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE r.rulename <> '_RETURN'::name;
Подробнее эти команды будут рассмотрены позже.
-----------------------------------------------------------------------
При сборке с библиотекой Readline имеются дополнительные возможности.
Во-первых, редактирование команд и их история, как в shell.
Управляющие переменные:
=> \echo :HISTCONTROL
:HISTCONTROL
=> \echo :HISTFILE
hist
=> \echo :HISTSIZE
:HISTSIZE
Историю можно сохранить в файл с помощью \s filename
-----------------------------------------------------------------------
Во-вторых, автодополнение имен объектов БД по клавише TAB.
Регистр символов при автодополнении определяется переменной:
=> \echo :COMP_KEYWORD_CASE
:COMP_KEYWORD_CASE
Конец демонстрации.
-----------------------------------------------------------------------
=> \q