Начало работы с psql
Определение версии psql
Прежде всего, убедимся, что мы работаем с правильной версией psql:
-
Проверьте путь к исполняемому файлу psql:
[student@ServerName ~]$ which psql/usr/bin/psql -
Посмотрите, что это за файл:
[student@ServerName ~]$ ls -l $(which psql)lrwxrwxrwx 1 root root 38 May 6 13:23 /usr/bin/psql -> /etc/alternatives/psqlЭто символическая ссылка.
-
Уточните тип файла
/etc/alternatives/psql:[student@ServerName ~]$ file /etc/alternatives/psql/etc/alternatives/psql: symbolic link to `/usr/pangolin-dbms-client-{major.minor}/bin/psql'Команда ОС
whichнаходит в каталогах, перечисленных в переменной окруженияPATH, путь к заданному аргументом исполняемому файлу (здесьpsql), если он имеется. Если таких файлов имеется несколько в разных каталогах, выводится путь к первому из них. Однако в этом примере командаwhichобнаружила не сам исполняемый файл, а символическую ссылку на него. Командаfileинформирует об этом и выдает путь к собственно исполняемому файлу. -
Проверьте версию psql:
[student@ServerName ~]$ psql --versionpsql (PostgreSQL) 15.5 -
Используя опцию
-cкомандыpsqlполучите информацию о версии сервера:[student@ServerName ~]$ psql -c 'select version()'psql: error: connection to server on socket "/tmp/.s.PGSQL.5432" failed: FATAL: role "student" does not existОшибка. Все дело в том, что клиент psql по умолчанию пытается подключиться к базе данных от имени текущего пользователя ОС (
student). Если такой роли нет в СУБД, подключение отклоняется.
Создание пользователя
До сих пор мы подключались к БД под пользователем postgres. Исправим это:
-
Подключитесь от имени
postgres:[student@ServerName ~]$ sudo su - postgres -
Зайдите в psql:
[postgres@ServerName ~]$ psqlpsql (15.5)Type "help" for help. -
Создайте роль
studentс правомLOGIN:postgres=# CREATE ROLE student PASSWORD 'student' LOGIN;CREATE ROLE -
Подключитесь от имени пользователя
student:postgres=# \c - studentYou are now connected to database "postgres" as user "student". -
Вернитесь к пользователю
student:[postgres@ServerName ~]$ exitlogout -
Снова попробуем выполнить запрос к psql. На этот раз укажем явно, что хотим обратиться к базе
postgres, с помощью ключа-d. В противном случае psql попробует подключиться к базе данныхstudent, а она еще не существует.[student@ServerName ~]$ psql -d postgres -c 'SELECT version()'version--------------------------------------------------------------------------------------------------------------------------------PostgreSQL 15.5 on x86_64-pc-linux-gnu, compiled by x86_64-alt-linux-gcc (GCC) 8.4.1 20200305 (ALT p9 8.4.1-alt0.p9.1), 64-bit(1 row)
Настройка приглашения
Для добавления информации о роли нужно в начало переменных PROMPT1 и PROMPT2 добавить %n@. Для того, чтобы настройки сохранялись между сеансами, необходимо поместить их в файл ~/.psqlrc.
Настройте приглашение для postgres:
-
Подключитесь от имени
postgres:[student@ServerName ~]$ sudo su - postgres -
Создайте файл
~/.psqlrc:[postgres@ServerName ~]$ vi ~/.psqlrc\set PROMPT1 %n@%/%R%x%#\set PROMPT2 %n@%/%R%x%# -
Зайдите в psql:
[postgres@ServerName ~]$ psqlpsql (15.5)Type "help" for help.Готово! Приглашение успешно изменено.
-
Выйдете из psql:
postgres@postgres=> \q
Самостоятельно настройте приглашение для пользователя student.
Выполнение скриптов
Клиент psql может выполнять скрипты на SQL. Файл скрипта можно указать после опции -f или же содержимое скрипта можно передать через stdin:
-
Создайте файл скрипта, содержащий SQL-команду
SELECT now();:[student@ServerName ~]$ echo 'SELECT now();' > script.sqlПроверьте содержимое файла:
[student@ServerName ~]$ cat script.sqlSELECT now(); -
Выполните скрипт через опцию
-f:[student@ServerName ~]$ psql -d postgres -f script.sqlnow-------------------------------2026-03-17 12:52:21.918499+03(1 row)Если вместо имени скрипта после опции
-fуказано тире, то ввод команд SQL также осуществляется изstdin:[student@ServerName ~]$ psql -d postgres -f -student@postgres=> SELECT now();now-------------------------------2026-03-17 15:02:22.171308+03(1 row) -
Можно передать SQL-команды через стандартный ввод, используя конвейер:
[student@ServerName ~]$ echo 'SELECT now();' | psql -d postgresnow-------------------------------2026-03-17 12:53:02.57801+03(1 row)Обратите внимание, что имя целевой базы данных можно указать в конце команды без ключа
-d:[student@ServerName ~]$ echo 'SELECT now();' | psql -f - postgresnow------------------------------2024-09-11 19:31:46.53685+03(1 row)
Журналирование
Для отладки или аудита может потребоваться сохранять все выполняемые команды в журнал. Опция -L psql позволяет указать файл для логирования.
-
Выполните запрос и сохраните его в файл
psql.log:[student@ServerName ~]$ psql -L psql.log -c 'SELECT session_user' postgressession_user---------------student(1 row) -
Посмотрите содержимое журнала:
[student@ServerName ~]$ cat psql.log********* QUERY **********SELECT session_user**************************session_user---------------student(1 row)Как видно, в журнал попал не только результат, но и сам запрос.