|
|||||||
Работа с консольным клиентом psql
Время создания: 29.07.2024 12:12
Автор: Егор Рогов, Павел Лузанов, Илья Баштанов, Алексей Береснев
Текстовые метки: sql, postgresql, psql, консольный, клиент, работа, использование
Раздел: Компьютер - Программирование - SQL - PostgreSQL
Запись: xintrea/mytetra_syncro/master/base/172224435696tu2ezvnq/text.html на raw.github.com
|
|||||||
|
|||||||
Подключение к БД Запуск $ psql -d база -U пользователь -h узел -p порт Новое подключение в psql => \c[onnect] база пользователь узел порт Информация о текущем подключении => \conninfo При запуске psql определяет параметры подключения: имя базы данных, имя пользователя, имя сервера, номер порта. Если эти параметры не указаны, psql попробует подключиться, используя значения по умолчанию:
Если требуется выполнить новое подключение не выходя из psql, нужно выполнить команду \connect. Значения по умолчанию для нее берутся из текущего соединения. Команда \conninfo выдает информацию о текущем подключении. Получение справки В командной строке ОС $ psql --help $ man psql В psql => \? список команд psql => \? variables переменные psql => \h[elp] список команд SQL => \h команда синтаксис команды SQL => \q выход Справочную информацию по psql можно получить не только в документации, но и прямо в системе. psql с ключом --help выдает справку по запуску. А если в системе была установлена документация, то справочное руководство можно получить командой man psql. psql умеет выполнять команды SQL и свои собственные команды. Все команды psql начинаются с обратной косой черты и, как правило, их можно сокращать до первой буквы. Внутри psql есть возможность получить список и краткое описание команд psql: \?. Команда \help выдает список команд SQL, которые поддерживает сервер, а также синтаксис конкретной команды SQL. И еще одна команда, которую полезно знать, хоть она и не имеет отношения к справке: это \q — выход из psql. В качестве альтернативы для выхода можно использовать команды exit и quit. Выполнение команд SQL и форматирование результатов Запускаем psql: student$ psql Проверим текущее подключение: => \conninfo You are connected to database "student" as user "student" via socket in "/var/run/postgresql" at port "5432". С параметрами по умолчанию мы подключились к базе данных student под пользователем student. Подробнее о базах данных и пользователях будет рассказано в следующих темах курса. Команда \c[onnect] выполняет новое подключение, не покидая psql. Команды SQL, в отличие от команд psql, могут располагаться на нескольких строках. Для отправки команды SQL на выполнение завершаем ее точкой с запятой: => SELECT schemaname, tablename, tableowner FROM pg_tables LIMIT 5; schemaname | tablename | tableowner ------------+-----------------------+------------ pg_catalog | pg_statistic | postgres pg_catalog | pg_type | postgres pg_catalog | pg_foreign_table | postgres pg_catalog | pg_authid | postgres pg_catalog | pg_statistic_ext_data | postgres (5 rows) Утилита psql умеет выводить результат запросов в разных форматах. Вот только некоторые из них:
Формат с выравниванием используется по умолчанию. Ширина столбцов выровнена по значениям. Также выводится строка заголовков и итоговая строка. Команды psql для переключения режима выравнивания:
Отключим выравнивание, вывод заголовка и итоговой строки, а в качестве разделителя столбцов установим пробел: => \t \a Tuples only is on. Output format is unaligned. => \pset fieldsep ' ' Field separator is " ". => SELECT schemaname, tablename, tableowner FROM pg_tables LIMIT 5; pg_catalog pg_statistic postgres pg_catalog pg_type postgres pg_catalog pg_foreign_table postgres pg_catalog pg_authid postgres pg_catalog pg_statistic_ext_data postgres => \t \a Tuples only is off. Output format is aligned. Расширенный формат удобен, когда нужно вывести много столбцов для одной или нескольких записей: => \x Expanded display is on. => SELECT * FROM pg_tables WHERE tablename = 'pg_class'; -[ RECORD 1 ]----------- schemaname | pg_catalog tablename | pg_class tableowner | postgres tablespace | hasindexes | t hasrules | f hastriggers | f rowsecurity | f => \x Expanded display is off. Расширенный формат можно установить только для одного запроса, если в конце вместо точки с запятой указать \gx: => SELECT * FROM pg_tables WHERE tablename = 'pg_proc' \gx -[ RECORD 1 ]----------- schemaname | pg_catalog tablename | pg_proc tableowner | postgres tablespace | hasindexes | t hasrules | f hastriggers | f rowsecurity | f Все возможности форматирования результатов запросов доступны через команду \pset. А без параметров она покажет текущие настройки форматирования: => \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 xheader_width full Взаимодействие с ОС В psql можно выполнять команды shell: => \! pwd /home/student Можно установить переменную окружения операционной системы: => \setenv HELLO Hello
=> \! echo $HELLO Hello Можно записать вывод команды в файл с помощью \o[ut]: => \o tmp/dba1_log
=> SELECT schemaname, tablename, tableowner FROM pg_tables LIMIT 5; На экран ничего не попало. Посмотрим в файле: => \! cat tmp/dba1_log schemaname | tablename | tableowner ------------+-----------------------+------------ pg_catalog | pg_statistic | postgres pg_catalog | pg_type | postgres pg_catalog | pg_foreign_table | postgres pg_catalog | pg_authid | postgres pg_catalog | pg_statistic_ext_data | postgres (5 rows) Вернем вывод на экран: => \o Выполнение скриптов Еще один вариант отправить запрос на выполнение — команда \g. В скобках можно указать параметры форматирования только для этого запроса. Вывод запроса можно направить команде ОС, если указать указать ее после вертикальной черты. Например, можно вывести результат запроса на экран, пронумеровав строки: => SELECT format('SELECT count(*) FROM %I;', tablename) FROM pg_tables LIMIT 3 \g (tuples_only=on format=unaligned) | cat -n 1SELECT count(*) FROM pg_statistic; 2SELECT count(*) FROM pg_type; 3SELECT count(*) FROM pg_foreign_table; В команде \g можно указать имя файла, в который будет направлен вывод: => SELECT format('SELECT count(*) FROM %I;', tablename) FROM pg_tables LIMIT 3 \g (tuples_only=on format=unaligned) tmp/dba1_log Вот что получилось в файле: => \! cat tmp/dba1_log SELECT count(*) FROM pg_statistic; SELECT count(*) FROM pg_type; SELECT count(*) FROM pg_foreign_table; Выполняем теперь этот файл как скрипт с помощью \i[nclude]: => \i tmp/dba1_log count ------- 409 (1 row) count ------- 613 (1 row) count ------- 0 (1 row) Другие способы выполнить команды из файла: psql < filename psql -f filename В предыдущем примере можно обойтись и без создания файла, если завершить запрос командой \gexec: => SELECT format('SELECT count(*) FROM %I;', tablename) FROM pg_tables LIMIT 3 \gexec count ------- 409 (1 row) count ------- 613 (1 row) count ------- 0 (1 row) Команда \gexec считает, что в каждом столбце каждой строки выборки содержится SQL-оператор, и выполняет эти операторы один за другим. Переменные psql и управляющие конструкции По аналогии с shell, psql имеет собственные переменные, среди которых есть ряд встроенных (имеющих особый смысл для psql). Запомним в переменной psql User значение переменной окружения USER: => \getenv User USER И установим переменную Test: => \set Test Hi Чтобы подставить ее значение, надо предварить имя переменной двоеточием: => \echo :Test :User! Hi student! Сбросить переменную можно так: => \unset Test
=> \echo :Test :Test Результат запроса можно записать в переменную. Для этого запрос нужно завершить командой \gset: => SELECT now() AS curr_time \gset
=> \echo :curr_time 2024-07-08 14:50:19.126332+03 Запрос должен возвращать только одну запись. Без параметров \set выдает значения всех установленных переменных: => \set AUTOCOMMIT = 'on' COMP_KEYWORD_CASE = 'preserve-upper' DBNAME = 'student' ECHO = 'none' ECHO_HIDDEN = 'off' ENCODING = 'UTF8' ERROR = 'false' FETCH_COUNT = '0' HIDE_TABLEAM = 'off' HIDE_TOAST_COMPRESSION = 'off' HISTCONTROL = 'none' HISTFILE = 'hist' HISTSIZE = '500' HOST = '/var/run/postgresql' IGNOREEOF = '0' LAST_ERROR_MESSAGE = '' LAST_ERROR_SQLSTATE = '00000' ON_ERROR_ROLLBACK = 'off' ON_ERROR_STOP = 'off' PORT = '5432' PROMPT1 = '%/%R%x%# ' PROMPT2 = '%/%R%x%# ' PROMPT3 = '>> ' QUIET = 'off' ROW_COUNT = '1' SERVER_VERSION_NAME = '16.3 (Ubuntu 16.3-1.pgdg22.04+1)' SERVER_VERSION_NUM = '160003' SHELL_ERROR = 'false' SHELL_EXIT_CODE = '0' SHOW_ALL_RESULTS = 'on' SHOW_CONTEXT = 'errors' SINGLELINE = 'off' SINGLESTEP = 'off' SQLSTATE = '00000' USER = 'student' User = 'student' VERBOSITY = 'default' VERSION = 'PostgreSQL 16.3 (Ubuntu 16.3-1.pgdg22.04+1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0, 64-bit' VERSION_NAME = '16.3 (Ubuntu 16.3-1.pgdg22.04+1)' VERSION_NUM = '160003' curr_time = '2024-07-08 14:50:19.126332+03' В скриптах можно использовать условные операторы. Предположим, что мы хотим проверить, установлено ли значение переменной working_dir, и если нет, то присвоить ей имя текущего каталога. Для проверки существования переменной можно использовать следующую конструкцию, возвращающую логическое значение: => \echo :{?working_dir} FALSE Следующий условный оператор psql проверяет существование переменной и при необходимости устанавливает значение по умолчанию: => \if :{?working_dir} -- переменная определена \else -- в качестве значения можно установить результат выполнения команды ОС \set working_dir `pwd` \endif Теперь мы можем быть уверены, что переменная working_dir определена: => \echo :working_dir /home/student Команды для работы с системным каталогом С помощью серии команд, в основном начинающихся на \d, можно быстро и удобно получать информацию об объектах БД. Например: => \d pg_tables View "pg_catalog.pg_tables" Column | Type | Collation | Nullable | Default -------------+---------+-----------+----------+--------- schemaname | name | | | tablename | name | | | tableowner | name | | | tablespace | name | | | hasindexes | boolean | | | hasrules | boolean | | | hastriggers | boolean | | | rowsecurity | boolean | | | Подробнее такие команды будут рассмотрены позже. Настройка psql При запуске psql выполняются два скрипта (при их наличии):
Пользовательский файл должен располагаться в домашнем каталоге, а расположение системного скрипта можно узнать командой: student$ pg_config --sysconfdir /etc/postgresql-common По умолчанию оба файла отсутствуют. В эти файлы можно поместить команды для настройки сеанса, например:
Для примера запишем в переменную top5 текст запроса на получение пяти самых больших по размеру таблиц:
=> \set top5 'SELECT tablename, pg_total_relation_size(schemaname||''.''||tablename) AS bytes FROM pg_tables ORDER BY bytes DESC LIMIT 5;' Для выполнения запроса достаточно набрать: => :top5 tablename | bytes ----------------+--------- pg_proc | 1245184 pg_rewrite | 745472 pg_attribute | 720896 pg_description | 630784 pg_statistic | 294912 (5 rows) Если записать эту команду \set в файл ~/.psqlrc, переменная top5 будет доступна сразу после запуска psql. Благодаря поддержке readline, в psql работает автодополнение ключевых слов и имен объектов, а также сохраняется история команд. Имя и размер файла истории настраиваются переменными HISTFILE, HISTSIZE. Итоги psql — терминальный клиент для работы с СУБД При запуске требуются параметры подключения Выполняет команды SQL и psql Содержит инструменты для интерактивной работы, а также для подготовки и выполнения скриптов |
|||||||
Так же в этом разделе:
|
|||||||
|
|||||||
|