Интерактивный режим psql
Предусловие: пройдет раздел «Начало работы с psql».
Cпособы подключения
-
Запустите psql в интерактивном режиме, подключившись к базе данных
postgres:[student@ServerName ~]$ psql postgrespsql (15.5)Type "help" for help.Проверьте параметры текущего подключения:
student@postgres=> \conninfoYou are connected to database "postgres" as user "student" via socket in "/tmp" at port "5432".Пользователь ОС
studentзарегистрирован в СУБД, одноименной БД не существует, поэтому мы подключились к базе данныхpostgres. -
Разрешение на подключение пользователя к базе данных настраивается отдельно. В этой лабораторной работе ограничений на подключения нет.
Выполните различные варианты подключений из интерактивного режима:
-
Переключитесь на базу данных
template1:student@postgres=> \c template1You are now connected to database "template1" as user "student". -
Смените пользователя на суперпользователя
postgres, оставаясь в той же базе:student@template1=> \c - postgresYou are now connected to database "template1" as user "postgres". -
Вернитесь к пользователю
studentи базеpostgres:postgres@template1=# \c postgres studentYou are now connected to database "postgres" as user "student".
-
-
Подключитесь через
localhostсетевой интерфейс:student@postgres=> \c - - localhostYou are now connected to database "postgres" as user "student" on host "localhost" (address "127.0.0.1") at port "5432". -
Подключитесь через локальный UNIX-сокет:
student@postgres=> \c - - /tmpYou are now connected to database "postgres" as user "student" via socket in "/tmp" at port "5432".Здесь локальный UNIX-сокет находится в каталоге
/tmp. Расположение настраивается и может быть иным.
Помощь SQL
-
Получите список метакоманд
psql:student@postgres=> \?General\copyright show PostgreSQL usage and distribution terms\crosstabview [COLUMNS] execute query and display result in crosstab\errverbose show most recent error message at maximum verbosity\g [(OPTIONS)] [FILE] execute query (and send result to file or |pipe);\g with no arguments is equivalent to a semicolon\gdesc describe result of query, without executing it\gexec execute query, then execute each value in its result\gset [PREFIX] execute query and store result in psql variables\gx [(OPTIONS)] [FILE] as \g, but forces expanded output mode\q quit psql\watch [SEC] execute query every SEC secondsHelp\? [commands] show help on backslash commands\? options show help on psql command-line options\? variables show help on special variables\h [NAME] help on syntax of SQL commands, * for all commandsQuery Buffer\e [FILE] [LINE] edit the query buffer (or file) with external editor\ef [FUNCNAME [LINE]] edit function definition with external editor\ev [VIEWNAME [LINE]] edit view definition with external editor\p show the contents of the query buffer\r reset (clear) the query buffer\s [FILE] display history or save it to file\w FILE write query buffer to fileInput/Output\copy ... perform SQL COPY with data stream to the client host\echo [-n] [STRING] write string to standard output (-n for no newline)\i FILE execute commands from file\ir FILE as \i, but relative to location of current script\o [FILE] send all query results to file or |pipe\qecho [-n] [STRING] write string to \o output stream (-n for no newline)\warn [-n] [STRING] write string to standard error (-n for no newline)...Поскольку вывод не помещается на один экран, автоматически должен запуститься постраничный просмотрщик (это можно отключить или настроить). Для выхода из программы просмотра нажмите
q. -
Метакоманда
\hвыводит помощь по командам SQL:student@postgres=> \hAvailable help:ABORT CREATE FOREIGN DATA WRAPPER DROP ROUTINEALTER AGGREGATE CREATE FOREIGN TABLE DROP RULEALTER COLLATION CREATE FUNCTION DROP SCHEMAALTER CONVERSION CREATE GROUP DROP SEQUENCEALTER DATABASE CREATE INDEX DROP SERVERALTER DEFAULT PRIVILEGES CREATE LANGUAGE DROP STATISTICS... -
Получите помощь по синтаксису команды
CREATE VIEW:student@postgres=> \h CREATE VIEWCommand: CREATE VIEWDescription: define a new viewSyntax:CREATE [ OR REPLACE ] [ TEMP | TEMPORARY ] [ RECURSIVE ] VIEW name [ ( column_name [, ...] ) ][ WITH ( view_option_name [= view_option_value] [, ... ] ) ]AS query[ WITH [ CASCADED | LOCAL ] CHECK OPTION ]URL: https://www.postgresql.org/docs/15/sql-createview.html
Форматирование вывода
-
Получите текущее время:
-
с заголовком:
student@postgres=> SELECT now();now-------------------------------2026-03-17 16:27:49.761906+03(1 row) -
и без него:
student@postgres=> \tTuples only is on.student@postgres=> SELECT now();2026-03-17 16:28:12.094638+03
-
-
Для наглядности рассмотрим таблицу
pg_am, которая содержит список методов доступа к данным.-
У нас уже отключен вывод заголовков. Посмотрите на вывод таблицы:
student@postgres=> SELECT * FROM pg_am;2 | heap | heap_tableam_handler | t403 | btree | bthandler | i405 | hash | hashhandler | i783 | gist | gisthandler | i2742 | gin | ginhandler | i4000 | spgist | spghandler | i3580 | brin | brinhandler | i5555 | stir | stirhandler | i -
Отключите выравнивание:
student@postgres=> \aOutput format is unaligned. -
Повторите запрос:
student@postgres=> SELECT * FROM pg_am;2|heap|heap_tableam_handler|t403|btree|bthandler|i405|hash|hashhandler|i783|gist|gisthandler|i2742|gin|ginhandler|i4000|spgist|spghandler|i3580|brin|brinhandler|i5555|stir|stirhandler|i -
Верните стандартные настройки форматирования:
student@postgres=> \a \tOutput format is aligned.Tuples only is off.
-
-
Получите первую строку этой таблицы в подробном формате вывода:
student@postgres=> \xExpanded display is on.student@postgres=> SELECT * FROM pg_am LIMIT 1;-[ RECORD 1 ]-------------------oid | 2amname | heapamhandler | heap_tableam_handleramtype | tstudent@postgres=> \xExpanded display is off.student@postgres=> SELECT * FROM pg_am LIMIT 1 \gx-[ RECORD 1 ]-------------------oid | 2amname | heapamhandler | heap_tableam_handleramtype | t -
Включите формат вывода
csvи выведите ту же таблицу:student@postgres=> \pset format csvOutput format is csv.student@postgres=> SELECT * FROM pg_am LIMIT 1;oid,amname,amhandler,amtype2,heap,heap_tableam_handler,tstudent@postgres=> SELECT * FROM pg_am LIMIT 1 \gxoid,2amname,heapamhandler,heap_tableam_handleramtype,t -
Установите выровненный формат вывода:
student@postgres=> \pset format alignedOutput format is aligned.student@postgres=> SELECT * FROM pg_am LIMIT 1 \gx-[ RECORD 1 ]-------------------oid | 2amname | heapamhandler | heap_tableam_handleramtype | t
Буфер запроса
-
Выведите содержимое буфера запросов:
student@postgres=> \pSELECT * FROM pg_am LIMIT 1 -
Выведите текущее время. Используя команду
\watch, повторите команду в буфере несколько раз. Для остановки выводаCtrl+C:student@postgres=> \watchFri 09 May 2025 04:12:18 PM MSK (every 2s)oid | amname | amhandler | amtype-----+--------+----------------------+--------2 | heap | heap_tableam_handler | t(1 row)Fri 09 May 2025 04:12:20 PM MSK (every 2s)oid | amname | amhandler | amtype-----+--------+----------------------+--------2 | heap | heap_tableam_handler | t(1 row)Fri 09 May 2025 04:12:22 PM MSK (every 2s)oid | amname | amhandler | amtype-----+--------+----------------------+--------2 | heap | heap_tableam_handler | t(1 row)
Ввод-вывод
-
Отключите вывод заголовков и выравнивание, установите в качестве разделителя пробел. Направьте весь вывод в файл:
student@postgres=> \a \t \f ' 'Output format is unaligned.Tuples only is on.Field separator is " ".student@postgres=> \o db_sizes.sql -
Используя функцию форматирования, защищающую от SQL-вставок, сформируйте текст команд SQL, при выполнении которых будут получены данные о размерах БД:
student@postgres=> SELECT format('SELECT ''%I:'', pg_size_pretty(pg_database_size(''%I''));', datname, datname) from pg_database;student@postgres=> \ostudent@postgres=> \! cat db_sizes.sqlSELECT 'template1:', pg_size_pretty(pg_database_size('template1'));SELECT 'template0:', pg_size_pretty(pg_database_size('template0'));SELECT 'postgres:', pg_size_pretty(pg_database_size('postgres')); -
Выполните скрипт, записанный в файл:
student@postgres=> \i db_sizes.sqltemplate1: 9126 kBtemplate0: 9078 kBpostgres: 9078 kB -
Выйдите из psql:
student@postgres=> \q
Переменные
-
Запустите psql с установленной переменной
myVar:[student@ServerName ~]$$ psql -v myVar=123 postgrespsql (15.5)Type "help" for help.student@postgres=> \echo :myVar123 -
Запишите в переменную
bkndPIDидентификатор обслуживающего процесса:student@postgres=> select pg_backend_pid() as bkndPID \gsetstudent@postgres=> \echo :bkndpid35719 -
Получите из
pg_stat_activityинформацию об этом процессе:student@postgres=> SELECT pid, backend_type FROM pg_stat_activity WHERE pid = :bkndpid;pid | backend_type-------+----------------35719 | client backend(1 row)
Взаимодействие с ОС
-
В сеансе psql получите
PIDобслуживающего процесса и передайте его команде ОС для получения информации о процессе:student@postgres=> SELECT pg_backend_pid() \g (tuples_only=on) | xargs ps -fpUID PID PPID C STIME TTY TIME CMDpostgres 35719 11935 0 16:16 ? 00:00:00 postgres: student postgres [local] idleЗдесь использована метакоманда psql
\g, которая записывает вывод команды SQL в файл, либо же передает его через конвейер команде ОС. В примереPIDпередан командеxargs, конструирующей и выполняющей другую команду:ps -fp <PID>. -
Получите
PIDпервого по порядку серверного процесса, обслуживающего сессию пользователяpostgres, в интерактивном режиме команды psql:student@postgres=> \! ps -C postgres -o pid,cmd | awk '/student/{print $1}' | head -135719В этой команде получены
PIDи командные строки процессов, в имени которых есть строкаpostgres, далее средствами потокового редактораawkвыделены строки, в которых естьstudent(это серверные процессы, обслуживающие сессии пользователяstudent, их может быть несколько) и печатает первое поле —PID, а затемhead -1оставляет лишь первую строку.В результате получен
PIDпервого серверного процесса, обслуживающего сессиюstudent. -
Поместите результат предыдущей команды в переменную
psqlи выведите информацию об этом процессе средствами СУБД:student@postgres=> SELECT pid, backend_type FROM pg_stat_activity WHERE pid = :bkndpid;pid | backend_type-------+----------------35719 | client backend(1 row) -
Выйдите из psql:
student@postgres=> \q
Самопроверка
Вопрос 1
В shell последовательно выполнены следующие команды:
$ sudo su - postgres
postgres$ psql
psql (15.5)
Введите "help", чтобы получить справку.
postgres=# \c - monitoring
К какой базе данных выполнялось подключение в последней команде?
Вопрос 2
Сразу после инициализации кластера баз данных было выполнено подключение к базе данных postgres с использованием клиента psql.
Файлы psqlrc и .psqlrc не создавались.
В открытом сеансе psql была выполнена следующая последовательность команд (вывод команд не приведен):
postgres=# \t
postgres=# \l
Какое количество текстовых строк было отображено в выводе последней команды?
Вопрос 3
В открытом сеансе psql была выполнена следующая последовательность команд (вывод команд не приведен):
postgres=# \t
postgres=# \o query.sql
postgres=# SELECT 'SELECT 1;';
postgres=# \o
postgres=# \i query.sql
Файлы psqlrc и .psqlrc не создавались.
Какой вывод был отображен в консоли psql в результате выполнения последней команды?
Вопрос 4
В открытом сеансе psql была выполнена следующая последовательность команд:
postgres=# \t
Режим вывода только кортежей выключен.
postgres=# SELECT 1\gx
Какое количество текстовых строк было отображено в выводе последней команды?