psql 

Выполнение команд SQL:

        => select schemaname, tablename, tableowner from pg_tables limit 10;
         schemaname |    tablename    | tableowner 
        ------------+-----------------+------------
         pg_catalog | pg_statistic    | postgres
         pg_catalog | pg_type         | postgres
         public     | people          | 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
        (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
         public     | people          | 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
        (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
        public people 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

...и вернем обратно:

        => \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;
        <table border="1">
          <tr>
            <th align="center">schemaname</th>
            <th align="center">tablename</th>
            <th align="center">tableowner</th>
          </tr>
          <tr valign="top">
            <td align="left">pg_catalog</td>
            <td align="left">pg_statistic</td>
            <td align="left">postgres</td>
          </tr>
        </table>
        <p>(1 row)<br />
        </p>

        => \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/postgres/edu/dba1/practice

-----------------------------------------------------------------------

Для изменения текущего (для psql) каталога есть специальная команда:

        => \! pwd
        /home/postgres/edu/dba1/practice

        => \cd ..

        => \! pwd
        /home/postgres/edu/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
         public     | people       | postgres
         pg_catalog | pg_authid    | postgres
         pg_catalog | pg_attribute | 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 people ;

-----------------------------------------------------------------------

И выполним теперь эти команды с помощью \i[nclude]:

        => \i dba1_log
         count 
        -------
           407
        (1 row)
        
         count 
        -------
           372
        (1 row)
        
         count 
        -------
             2
        (1 row)
        

-----------------------------------------------------------------------

Другие способы выполнить команды из файла:
а) psql < filename
б) psql -f filename
в) psql -c command (работает только для одной команды)

Файл также можно отредактировать, не выходя из psql, с помощью \e[dit] filename,
при этом используется редактор $PSQL_EDITOR (или $EDITOR, или $VISUAL)

-----------------------------------------------------------------------

Последняя команда SQL попадает в буфер запроса.

Выполним команду и выведем содержимое буфера с помощью \p[rint]:

        => select now();
                      now              
        -------------------------------
         2015-12-30 15:27:01.954074+03
        (1 row)
        

        => \p
        select now();

Выполним команду, не вводя ее заново (в остальном \g аналогична точке с запятой):

        => \g
                      now              
        -------------------------------
         2015-12-30 15:27:01.959257+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
        2015-12-30 15:27:01.98212+03

Значение переменной можно запросить и у пользователя с помощью \prompt text name
А также указать при запуске: psql -v name=value

-----------------------------------------------------------------------

Без параметров \set выдает значения всех переменных:

        => \set
        AUTOCOMMIT = 'on'
        PROMPT1 = '%/%R%# '
        PROMPT2 = '%/%R%# '
        PROMPT3 = '>> '
        VERBOSITY = 'default'
        VERSION = 'PostgreSQL 9.4.4 on x86_64-unknown-linux-gnu, compiled by gcc (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4, 64-bit'
        HISTFILE = 'hist'
        DBNAME = 'postgres'
        USER = 'postgres'
        PORT = '5432'
        ENCODING = 'UTF8'
        curr_time = '2015-12-30 15:27:01.98212+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
