PostgreSQL
Команды psql для PostgreSQL: шпаргалка с примерами
psql — терминальный клиент PostgreSQL. Через него можно подключиться к базе, выполнять SQL, смотреть таблицы и схемы, запускать SQL-файлы, импортировать CSV и сохранять вывод. Ниже сначала идёт короткая шпаргалка, затем — синтаксис и примеры по каждой задаче
Синтаксис примеров сверен с официальной документацией psql для PostgreSQL 18. Перед применением проверьте свою версию командой
psql --versionи откройте документацию той же версии, если она отличается
Быстрая шпаргалка: основные команды psql
| Команда | Задача | Подробнее |
|---|---|---|
psql -U postgres -d mydb |
Подключиться к базе | Подключение |
\conninfo |
Показать текущее подключение | Подключение |
\l |
Вывести список баз | Базы и объекты |
\c mydb |
Переключиться на другую базу | Базы и объекты |
\dn |
Показать схемы | Базы и объекты |
\dt |
Показать таблицы | Базы и объекты |
\d users |
Показать структуру таблицы | Базы и объекты |
\du |
Вывести роли | Роли и пароли |
\i script.sql |
Выполнить SQL-файл в текущей сессии | Файлы и CSV |
\copy ... |
Импортировать или экспортировать CSV | Файлы и CSV |
\x auto |
Автоматически включать вертикальный вывод | Форматирование |
\timing on |
Показывать время SQL-запросов | Форматирование |
\o output.txt |
Направить вывод в файл | Форматирование |
\s |
Показать историю команд | Справка |
\? |
Открыть справку по метакомандам | Справка |
\q |
Выйти из psql | Частые вопросы |
Запуск psql и подключение к PostgreSQL
Для подключения обычно нужны хост, порт, имя пользователя и база. Если хост и базу не указать, psql использует значения по умолчанию и переменные окружения PostgreSQL
# База postgres на локальном сервере
psql -U postgres -d postgres
# Конкретный хост, порт, роль и база
psql -h localhost -p 5432 -U myuser -d mydb
# Linux: запуск от системного пользователя postgres
sudo -u postgres psql -d postgres
После входа проверьте фактическое подключение:
\conninfo
Команда покажет базу, роль, хост, порт и параметры SSL, если они используются
| Параметр | Назначение | Пример | Что произойдёт |
|---|---|---|---|
-h |
Хост или каталог Unix-сокета | -h db.example.com |
psql подключится к указанному серверу |
-p |
TCP-порт | -p 5432 |
Будет использован указанный порт |
-U |
Роль PostgreSQL | -U analyst |
Подключение пойдёт от имени analyst |
-d |
База или строка подключения | -d analytics |
psql откроет базу analytics |
-W |
Принудительно запросить пароль | -W |
Пароль будет запрошен до подключения |
-c |
Выполнить SQL или одну метакоманду | -c "SELECT version();" |
psql выполнит команду и завершится |
-f |
Прочитать SQL-файл | -f check.sql |
psql выполнит файл и завершится |
-Wне передаёт пароль в командной строке, а включает ранний запрос пароля. Для повторяющихся подключений безопаснее настроить пароль PostgreSQL и файл .pgpass, чем вписывать пароль в URI или shell-скрипт
Базы, схемы, таблицы и другие объекты
Метакоманды psql начинаются с обратной косой черты. Им не нужна точка с запятой
\l -- базы
\l+ -- базы с дополнительными сведениями
\c mydb -- переключиться на mydb
\c mydb myuser -- переключиться и сменить роль
\dn -- схемы
\dt -- видимые таблицы
\dt analytics.* -- таблицы схемы analytics
\dt *.* -- таблицы всех схем, включая системные
\d users -- структура users
\d+ users -- расширенное описание users
\dt users фильтрует список таблиц по шаблону users. Эта команда не показывает колонки таблицы. \d users показывает структуру: колонки, типы, NOT NULL, значения по умолчанию, индексы, ограничения, правила и триггеры
Другие часто нужные списки:
\di -- индексы
\dv -- представления
\dm -- материализованные представления
\df -- функции
\ds -- последовательности
\dp -- права на таблицы, представления и последовательности
<a id=»roles»></a>
Роли, пользователи и пароли
\du -- роли
\du+ -- роли с комментариями
\du myuser -- роль myuser
\password -- изменить пароль текущей роли
\password postgres
\passwordбезопаснее ручногоALTER ROLE ... PASSWORD: новый пароль не попадает в историю команд и серверный журнал. Для SQL-командCREATE ROLE,GRANTиREVOKEесть отдельная инструкция про пользователей и права в PostgreSQL
<a id=»files»></a>
Выполнение SQL, файлов и обмен CSV
В интерактивной сессии SQL-запрос обычно завершается точкой с запятой:
SELECT id, email, created_at
FROM users
WHERE active = true
ORDER BY created_at DESC
LIMIT 10;
Файл в открытой сессии запускает \i, а из shell — параметр -f:
\i /path/to/script.sql
psql -U postgres -d mydb -f script.sql
Пакетный запуск и коды завершения
Одноразовый запрос можно выполнить без входа в интерактивную сессию:
psql -U postgres -d postgres -Atc "SELECT current_database();"
Если подключение идёт к базе postgres, вывод будет таким:
postgres
Для скрипта, который должен остановиться при первой SQL-ошибке, включите ON_ERROR_STOP:
psql -v ON_ERROR_STOP=1 -U postgres -d mydb -f check.sql
echo $?
Код 0 означает нормальное завершение. Код 1 возвращается при фатальной ошибке самого psql, например если файл не найден. Код 2 означает, что соединение с сервером было потеряно в неинтерактивной сессии. Код 3 возвращается при ошибке в скрипте, если был включён ON_ERROR_STOP
На Windows вместо
echo $?используйтеecho %ERRORLEVEL%вcmd.exeили$LASTEXITCODEв PowerShell
Импорт и экспорт CSV через psql
Для импорта CSV в таблицу:
\copy users (id, email) FROM '/Users/me/users.csv' WITH (FORMAT csv, HEADER true)
Для экспорта результата запроса:
\copy (SELECT id, email FROM users ORDER BY id) TO '/Users/me/users.csv' WITH (FORMAT csv, HEADER true)
Файл читает или создаёт клиент psql на компьютере, где он запущен. В этом главное отличие
\copyот SQL-командыCOPYс именем файла: серверныйCOPYобращается к файловой системе сервера PostgreSQL и требует соответствующих прав. Более подробные сценарии разобраны в материале про импорт и экспорт данных PostgreSQL
<a id=»output»></a>
Форматирование и сохранение вывода
\x -- переключить вертикальный режим
\x auto -- включать его для широкого результата
\t -- скрыть заголовки колонок и счётчик строк
\timing on -- показывать время выполнения
\pset pager off -- отключить pager
\pset null 'NULL' -- печатать NULL явно
\pset format csv -- выводить CSV
\pset format aligned
Команда \o направляет все последующие результаты в файл. Вызов без аргумента возвращает вывод в терминал:
\o output.txt
SELECT id, email FROM users ORDER BY id;
\o
Shell, каналы и переменные psql
Команда \! запускает shell-команду на компьютере с psql. Безопасный пример \! pwd показывает текущий каталог:
\! pwd
Не вставляйте в \! непроверенные строки из базы или ввода пользователя: psql передаёт аргумент shell как команду
Вывод одного запроса можно передать в shell-канал. Для Unix-систем:
SELECT current_database(), current_user
\g | cat
Здесь \g | cat выполняет текущий SQL-буфер и передаёт успешный результат команде cat
\gset сохраняет единственную строку результата в переменные psql. Префикс info_ будет добавлен к именам колонок:
SELECT current_database() AS db, current_user AS usr
\gset info_
\echo :info_db :info_usr
Команда \gset info_ требует, чтобы запрос вернул ровно одну строку. \setenv PAGER less можно использовать для установки переменной окружения в процессе psql
Полезные системные запросы
-- Версия PostgreSQL
SELECT version();
SHOW server_version;
-- Текущая база и роль
SELECT current_database(), current_user;
SHOW port;
-- Размеры баз
SELECT datname,
pg_size_pretty(pg_database_size(datname)) AS size
FROM pg_database
ORDER BY pg_database_size(datname) DESC;
-- Таблицы схемы public и их общий размер
SELECT tablename,
pg_size_pretty(pg_total_relation_size(
format('%I.%I', schemaname, tablename)::regclass
)) AS size
FROM pg_tables
WHERE schemaname = 'public'
ORDER BY pg_total_relation_size(
format('%I.%I', schemaname, tablename)::regclass
) DESC;
-- Активные подключения
SELECT pid, usename, datname, state, query
FROM pg_stat_activity
WHERE state <> 'idle';
<a id=»help»></a>
Справка и история
\? -- справка по метакомандам psql
\h -- список SQL-команд со справкой
\h ALTER TABLE -- синтаксис ALTER TABLE
\s -- история команд
\e -- открыть редактор для текущего SQL-буфера
Если не помните команду, начните с \?: psql сам покажет список, соответствующий установленной версии клиента
<a id=»faq»></a>
Частые вопросы
Как выйти из psql?
Введите \q и нажмите Enter. В Unix-терминале также работает Ctrl+D. Если psql ждёт завершения многострочного запроса, Ctrl+C отменит текущий ввод и вернёт обычное приглашение
Как посмотреть таблицы через psql?
\dt показывает видимые пользовательские таблицы. Для конкретной схемы используйте \dt analytics.*. Для описания колонок, типов, индексов и ограничений нужна другая команда: \d users
Как подключиться к удалённому PostgreSQL?
Укажите хост, порт, роль и базу:
psql -h 192.168.1.100 -p 5432 -U myuser -d mydb
На сервере PostgreSQL должны быть настроены listen_addresses и pg_hba.conf, а сетевой экран должен пропускать нужный порт. Не открывайте базу для всего интернета и не отключайте TLS только ради того, чтобы убрать ошибку подключения