Перейти к основному содержимому

Начало работы с psql

Определение версии psql​

Прежде всего, убедимся, что мы работаем с правильной версией psql:

  1. Проверьте путь к исполняемому файлу psql:

    [student@ServerName ~]$ which psql
    /usr/bin/psql
  2. Посмотрите, что это за файл:

    [student@ServerName ~]$ ls -l $(which psql)
    lrwxrwxrwx 1 root root 38 May 6 13:23 /usr/bin/psql -> /etc/alternatives/psql

    Это символическая ссылка.

  3. Уточните тип файла /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 информирует об этом и выдает путь к собственно исполняемому файлу.

  4. Проверьте версию psql:

    [student@ServerName ~]$ psql --version
    psql (PostgreSQL) 15.5
  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. Исправим это:

  1. Подключитесь от имени postgres:

    [student@ServerName ~]$ sudo su - postgres
  2. Зайдите в psql:

    [postgres@ServerName ~]$ psql
    psql (15.5)
    Type "help" for help.
  3. Создайте роль student с правом LOGIN:

    postgres=# CREATE ROLE student PASSWORD 'student' LOGIN;
    CREATE ROLE
  4. Подключитесь от имени пользователя student:

    postgres=# \c - student
    You are now connected to database "postgres" as user "student".
  5. Вернитесь к пользователю student:

    [postgres@ServerName ~]$ exit
    logout
  6. Снова попробуем выполнить запрос к 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:

  1. Подключитесь от имени postgres:

    [student@ServerName ~]$ sudo su - postgres
  2. Создайте файл ~/.psqlrc:

    [postgres@ServerName ~]$ vi ~/.psqlrc
    \set PROMPT1 %n@%/%R%x%#
    \set PROMPT2 %n@%/%R%x%#
  3. Зайдите в psql:

    [postgres@ServerName ~]$ psql
    psql (15.5)
    Type "help" for help.

    Готово! Приглашение успешно изменено.

  4. Выйдете из psql:

    postgres@postgres=> \q

Самостоятельно настройте приглашение для пользователя student.

Выполнение скриптов​

Клиент psql может выполнять скрипты на SQL. Файл скрипта можно указать после опции -f или же содержимое скрипта можно передать через stdin:

  1. Создайте файл скрипта, содержащий SQL-команду SELECT now();:

    [student@ServerName ~]$ echo 'SELECT now();' > script.sql

    Проверьте содержимое файла:

    [student@ServerName ~]$ cat script.sql
    SELECT now();
  2. Выполните скрипт через опцию -f:

    [student@ServerName ~]$ psql -d postgres -f script.sql
    now
    -------------------------------
    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)
  3. Можно передать SQL-команды через стандартный ввод, используя конвейер:

    [student@ServerName ~]$ echo 'SELECT now();' | psql -d postgres
    now
    -------------------------------
    2026-03-17 12:53:02.57801+03
    (1 row)

    Обратите внимание, что имя целевой базы данных можно указать в конце команды без ключа -d:

    [student@ServerName ~]$ echo 'SELECT now();' | psql -f - postgres
    now
    ------------------------------
    2024-09-11 19:31:46.53685+03
    (1 row)

Журналирование​

Для отладки или аудита может потребоваться сохранять все выполняемые команды в журнал. Опция -L psql позволяет указать файл для логирования.

  1. Выполните запрос и сохраните его в файл psql.log:

    [student@ServerName ~]$ psql -L psql.log -c 'SELECT session_user' postgres
    session_user
    ---------------
    student
    (1 row)
  2. Посмотрите содержимое журнала:

    [student@ServerName ~]$ cat psql.log
    ********* QUERY **********
    SELECT session_user
    **************************

    session_user
    ---------------
    student
    (1 row)

    Как видно, в журнал попал не только результат, но и сам запрос.