02 Занятие 02: Базовый инструментарий / Использование psql
Эта страница извлечена из официального PDF в нативный Markdown. Текст слайдов, код и комментарии сохранены в порядке чтения; исходные PDF и HTML остаются эталоном макета. HTML source: dba1_02_tools_psql.html Archive: DBA1-handouts-16.zip Страниц PDF: 17
Page 1: Базовый инструментарий / Использование psql
Авторские права
© Postgres Professional, 2017–2024 Авторы: Егор Рогов, Павел Лузанов, Илья Баштанов, Алексей Береснев Фото: Олег Бартунов (монастырь Пху и пик Бхрикути, Непал)
Использование материалов курса
Некоммерческое использование материалов курса (презентации, демонстрации) разрешается без ограничений. Коммерческое использование возможно только с письменного разрешения компании Postgres Professional. Запрещается внесение изменений в материалы курса.
Обратная связь
Отзывы, замечания и предложения направляйте по адресу: edu@postgrespro.ru
Отказ от ответственности
Компания Postgres Professional не несет никакой ответственности за любые повреждения и убытки, включая потерю дохода, нанесенные прямым или непрямым, специальным или случайным использованием материалов курса. Компания Postgres Professional не предоставляет каких-либо гарантий на материалы курса. Материалы курса предоставляются на основе принципа «как есть» и компания Postgres Professional не обязана предоставлять сопровождение, поддержку, обновления, расширения и изменения.
Page 2: Темы занятия
Запуск psql и подключение к БД
- Получение справочной информации
- Работа в psql
- Настройка
Page 3: Назначение
Терминальный клиент для работы с PostgreSQL
- Поставляется вместе с СУБД
- Используется администраторами и разработчиками для интерактивной работы и выполнения скриптов
Комментарии преподавателя
Для работы с СУБД PostgreSQL существуют различные сторонние инструменты, рассмотрение которых не входит в рамки курса.
В курсе мы будем использовать терминальный клиент psql. Этот клиент может показаться непривычным для тех, кто предпочитает графические инструменты; тем не менее, он весьма удобен.
Это единственный клиент, поставляемый вместе с СУБД. Навыки работы c psql пригодятся разработчикам и администраторам БД вне зависимости от того, с каким инструментом они будут работать дальше.
https://postgrespro.ru/docs/postgresql/16/app-psql
Page 4: Подключение
Запуск
- Новое подключение в psql
- Информация о текущем подключении
Комментарии преподавателя
При запуске psql определяет параметры подключения: имя базы данных, имя пользователя, имя сервера, номер порта. Если эти параметры не указаны, psql попробует подключиться, используя значения по умолчанию:
● база — совпадает с именем пользователя;
● пользователь — совпадает с именем пользователя ОС;
● узел — соединение через Unix socket;
● порт — обычно 5432.
Если требуется выполнить новое подключение не выходя из psql, нужно выполнить команду \connect. Значения по умолчанию для нее берутся из текущего соединения.
Дополнительная информация о возможностях настройки подключения:
https://postgrespro.ru/docs/postgresql/16/libpq-envars
https://postgrespro.ru/docs/postgresql/16/libpq-pgservice
https://postgrespro.ru/docs/postgresql/16/libpq-pgpass
Page 5: Получение справки
В командной строке ОС
- В 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.
Page 6: Выполнение команд SQL и форматирование результатов
Запускаем psql:
Проверим текущее подключение:
С параметрами по умолчанию мы подключились к базе данных student под пользователем student. Подробнее о базах данных и пользователях будет рассказано в следующих темах курса. Команда \c[onnect] выполняет новое подключение, не покидая psql. Команды SQL, в отличие от команд psql, могут располагаться на нескольких строках. Для отправки команды SQL на выполнение завершаем ее точкой с запятой:
Утилита psql умеет выводить результат запросов в разных форматах. Вот только некоторые из них: формат с выравниванием значений; формат без выравнивания; расширенный формат. Формат с выравниванием используется по умолчанию. Ширина столбцов выровнена по значениям. Также выводится строка заголовков и итоговая строка. Команды psql для переключения режима выравнивания: \a — переключает режим с выравниванием и без выравнивания; \t — переключает отображения строки заголовка и итоговой строки. Отключим выравнивание, вывод заголовка и итоговой строки, а в качестве разделителя столбцов установим пробел:
Расширенный формат удобен, когда нужно вывести много столбцов для одной или нескольких записей:
Page 7: Page 7
Расширенный формат можно установить только для одного запроса, если в конце вместо точки с запятой указать \gx:
Все возможности форматирования результатов запросов доступны через команду \pset. А без параметров она покажет текущие настройки форматирования:
Взаимодействие с ОС
В psql можно выполнять команды shell:
Можно установить переменную окружения операционной системы:
Можно записать вывод команды в файл с помощью \o[ut]:
На экран ничего не попало. Посмотрим в файле:
Вернем вывод на экран:
Выполнение скриптов
Еще один вариант отправить запрос на выполнение — команда \g. В скобках можно указать параметры форматирования только для этого запроса. Вывод запроса можно направить команде ОС, если указать ее после вертикальной черты. Например, можно вывести результат запроса на экран, пронумеровав строки:
Page 8: Page 8
В команде \g можно указать имя файла, в который будет направлен вывод:
Вот что получилось в файле:
Выполняем теперь этот файл как скрипт с помощью \i[nclude]:
Другие способы выполнить команды из файла: psql < filename psql -f filename В предыдущем примере можно обойтись и без создания файла, если завершить запрос командой \gexec:
Команда gexec считает, что в каждом столбце каждой строки выборки содержится SQL-оператор, и выполняет эти операторы один за другим.
Переменные psql и управляющие конструкции
По аналогии с shell, psql имеет собственные переменные, среди которых есть ряд встроенных (имеющих особый смысл для psql). Запомним в переменной psql User значение переменной окружения USER:
И установим переменную Test:
Чтобы подставить ее значение, надо предварить имя переменной двоеточием:
Сбросить переменную можно так:
Результат запроса можно записать в переменную. Для этого запрос нужно завершить командой \gset:
Page 9: Page 9
Запрос должен возвращать только одну запись. Без параметров \set выдает значения всех установленных переменных:
В скриптах можно использовать условные операторы. Предположим, что мы хотим проверить, установлено ли значение переменной working_dir, и если нет, то присвоить ей имя текущего каталога. Для проверки существования переменной можно использовать следующую конструкцию, возвращающую логическое значение:
Следующий условный оператор psql проверяет существование переменной и при необходимости устанавливает значение по умолчанию:
Теперь мы можем быть уверены, что переменная working_dir определена:
Команды для работы с системным каталогом
С помощью серии команд, в основном начинающихся на \d, можно быстро и удобно получать информацию об объектах БД. Например:
Подробнее такие команды будут рассмотрены позже.
Page 10: Настройка psql
При запуске psql выполняются два скрипта (при их наличии): сначала общий системный скрипт psqlrc; затем пользовательский файл .psqlrc. Пользовательский файл должен располагаться в домашнем каталоге, а расположение системного скрипта можно узнать командой:
По умолчанию оба файла отсутствуют. В эти файлы можно поместить команды для настройки сеанса, например: приглашение psql; программу постраничного просмотра результатов запросов; переменные для хранения текста часто используемых команд. Для примера запишем в переменную top5 текст запроса на получение пяти самых больших по размеру таблиц:
Для выполнения запроса достаточно набрать:
Если записать эту команду \set в файл ~/.psqlrc, переменная top5 будет доступна сразу после запуска psql. Благодаря поддержке readline, в psql работает автодополнение ключевых слов и имен объектов, а также сохраняется история команд. Имя и размер файла истории настраиваются переменными HISTFILE, HISTSIZE.
Page 11: Итоги
psql — терминальный клиент для работы с СУБД
- При запуске требуются параметры подключения
- Выполняет команды SQL и psql
- Содержит инструменты для интерактивной работы, а также для подготовки и выполнения скриптов
Page 12: Практика
- Запустите psql и проверьте информацию о текущем подключении. 2. Выведите список баз данных в подробном виде. 3. По умолчанию psql использует команду «less» для постраничного просмотра результатов запроса. Замените ее на команду «less -XS» и снова выведите подробный список баз данных. 4. По умолчанию приглашение psql показывает только имя базы данных. Настройте вид приглашения так: пользователь@база=#. 5. Настройте psql так, чтобы для всех команд выводилась длительность выполнения. Убедитесь, что при повторном запуске эта настройка сохраняется.
Комментарии преподавателя
При запуске psql можно не указывать параметры подключения, будут действовать значения по умолчанию.
Используйте команду \l+.
Программа постраничного просмотра настраивается переменной окружения PSQL_PAGER. Настройку можно сделать в файле .psqlrc с помощью команды \setenv. Это позволит задать значение «less -XS» только для работы в psql, а в остальных случаях будут действовать обычные настройки ОС. По умолчанию less переносит длинные строки при просмотре и очищает свой вывод при выходе. Параметр -XS отменяет это поведение.
Описание настройки приглашения в документации:
https://postgrespro.ru/docs/postgresql/16/app-psql#APP-PSQL-PROMPTIN G
- Команду psql для вывода длительности выполнения запросов можно найти в документации или с помощью команды \?.
Page 13: 1. Запуск psql и просмотр информации о подключении
2. Список баз данных
Команда \l+ выводит подробную информацию о базах данных. Если результат запроса не помещается в окне терминала, psql передает его программе less. В ней можно просматривать результаты запроса, используя клавиши навигации. Команда h выводит справку по less, команда q завершает просмотр.
Однако просматривать результат команды неудобно. По умолчанию less переносит длинные строки, из-за чего результаты бывает сложно читать. Также при выходе из less ранее выведенный текст стирается.
3. Команда постраничного просмотра
Если использовать утилиту less с параметрами -XS, длинные строки не будут разбиваться переносами, а при выходе из less предыдущий вывод будет сохраняться. Для такой настройки достаточно установить переменную PSQL_PAGER с помощью \setenv. Запишем эту настройку в скрипт ~/.psqlrc:
4. Настройка приглашения
Для добавления информации о роли нужно в начало переменных PROMPT1 и PROMPT2 добавить %n@.
Переменная PROMPT1 определяет приглашение для первой строки вводимого пользователем запроса. Если запрос занимает более одной строки, начиная со второй за приглашение отвечает переменная PROMPT2. Обе переменные имеют одинаковое значение по умолчанию, но можно установить разные приглашения для первой и последующих строк запроса. Переменная PROMPT3 используется только для команды COPY.
5. Вывод длительности выполнения команд SQL
В итоге содержимое файла .psqlrc станет таким:
Page 14: Page 14
Чтобы изменения вступили в силу, нужно выйти и заново войти в psql.
Проверьте после повторного запуска: приглашение (должно включать имя роли); вывод подробной информации о базах данных; вывод времени выполнения команд.
Page 15: Практика+
- Откройте транзакцию и выполните команду, которая завершается любой ошибкой. Убедитесь, что продолжить работу в этой транзакции невозможно.
- Задайте переменной ON_ERROR_ROLLBACK значение on и убедитесь, что после ошибки можно выполнять команды внутри транзакции.
Комментарии преподавателя
- Чтобы открыть транзакцию, выполните команду
- Значение ON_ERROR_ROLLBACK = on заставляет psql устанавливать точку сохранения (SAVEPOINT) перед каждой командой SQL в открытой транзакции и в случае ошибки откатываться к этой точке сохранения.
https://postgrespro.ru/docs/postgresql/16/sql-savepoint
Page 16: 1. Утилита psql и обработка ошибок внутри транзакций
Утилита psql по умолчанию работает в режиме автоматической фиксации транзакций. Поэтому любая команда SQL выполняется в отдельной транзакции. Чтобы явно начать транзакцию, нужно выполнить команду BEGIN:
Обратите внимание на то, что приглашение psql изменилось. Символ «звездочка» говорит о том, что транзакция сейчас активна.
Предположим, мы случайно сделали ошибку в следующей команде:
О случившейся ошибке можно узнать из приглашения: звездочка изменилась на восклицательный знак. Попробуем исправить команду:
Но PostgreSQL не умеет откатывать только одну команду транзакции, поэтому транзакция обрывается и откатывается целиком. Чтобы продолжить работу, мы должны выполнить команду завершения транзакции. Не важно, будет ли это COMMIT или ROLLBACK, ведь транзакция уже отменена.
Создание таблицы было отменено, поэтому ее нет в базе данных:
2. Переменная ON\_ERROR\_ROLLBACK
Изменим поведение psql.
Теперь перед каждой командой транзакции неявно будет устанавливаться точка сохранения, а в случае ошибки будет происходить автоматический откат к этой точке. Это даст возможность продолжить выполнение команд транзакции.
Page 17: Page 17
Переменной ON_ERROR_ROLLBACK можно установить значение interactive, тогда подобное поведение будет только в интерактивном режиме работы, но не при выполнении скриптов.