← Весь справочник

psql

Консольный клиент PostgreSQL — подключение, мета-команды \l \dt \d \du, запросы из скриптов, роли и права

psql подключается к серверу PostgreSQL и выполняет SQL. Кроме SQL понимает мета-команды с обратной косой чертой: \dt, \d, \du показывают структуру базы без запросов к системным таблицам.

Синтаксис

psql [-h хост] [-p порт] [-U пользователь] [-d база] [-c 'SQL'] [-f файл.sql]
psql 'postgresql://пользователь:пароль@хост:порт/база'

Без -c и -f открывается интерактивная консоль (выход — \q). Если -d не указан, psql подключается к базе с тем же именем, что и пользователь.

Опции

Подключение

ОпцияЧто делает
-h хостподключение по TCP; без -h — через Unix-сокет на этой машине
-p портпорт сервера (по умолчанию 5432)
-U имяроль PostgreSQL; по умолчанию — имя пользователя ОС
-d базабаза данных
-W / -wвсегда спрашивать пароль / никогда не спрашивать (для скриптов)
-lпоказать список баз и выйти

Выполнение

ОпцияЧто делает
-c 'SQL'выполнить команду и выйти; можно повторять несколько раз
-f файлвыполнить SQL из файла (-f - — из stdin)
-v ON_ERROR_STOP=1остановиться на первой ошибке и вернуть ненулевой код (для -f — 3)
-1выполнить весь -f/-c одной транзакцией: ошибка откатит всё
-v имя=значениезадать переменную psql; в файле она подставляется как :имя или :'имя'
-Xне читать ~/.psqlrc
-qне печатать служебные ответы вроде CREATE TABLE
-Eпоказать SQL, который выполняют мета-команды

Формат вывода

ОпцияЧто делает
-Aбез выравнивания
-tтолько строки: без заголовков и (N rows)
-Atc 'SQL'частая связка для скриптов: голое значение без рамок
-F ','разделитель полей в режиме -A (по умолчанию |)
--csvвывод в CSV
-xвертикальный вывод: каждая колонка на своей строке
-o файлрезультат запросов — в файл

Мета-команды

Структура

КомандаЧто показывает
\l / \l+список баз (с размерами)
\c база [роль]переключиться на другую базу
\dt / \dt+таблицы текущей базы (с размерами); \dt схема.* — в схеме
\dвсе таблицы, представления, последовательности
\d таблица / \d+ таблицаколонки, типы, значения по умолчанию, индексы, ограничения
\di, \dv, \ds, \dfиндексы, представления, последовательности, функции
\dnсхемы
\du (или \dg)роли и их атрибуты
\dp таблица (или \z)права на таблицу (кто что может)
\conninfoк какой базе и под какой ролью подключён клиент

Работа в консоли

КомандаЧто делает
\xпереключить вертикальный вывод
\timing onпоказывать время выполнения запросов
\pset format csvсменить формат вывода (aligned, unaligned, csv, html…)
\i файл.sqlвыполнить файл
\o файл / \oписать результаты в файл / вернуть на экран
\copy таблица TO 'файл' CSV HEADERвыгрузить таблицу в файл на стороне клиента
\copy таблица FROM 'файл' CSV HEADERзагрузить файл в таблицу
\password рольсменить пароль, не показывая его в истории
\h команда / \?справка по SQL-команде / по мета-командам
\qвыход

Роли и права (SQL)

ЗапросЧто делает
CREATE ROLE app LOGIN PASSWORD 'pw'роль, которая может входить (CREATE USER — то же с LOGIN по умолчанию)
CREATE ROLE readers NOLOGINгрупповая роль без входа
ALTER ROLE app CREATEDB / SUPERUSERвыдать атрибут роли
ALTER ROLE app PASSWORD 'new'сменить пароль
GRANT readers TO appвключить роль в группу: права группы наследуются
CREATE DATABASE shop OWNER appбаза, владелец которой — роль
GRANT CONNECT ON DATABASE shop TO appправо подключаться к базе
GRANT USAGE ON SCHEMA public TO appправо обращаться к объектам схемы
GRANT SELECT, INSERT ON orders TO appправа на таблицу: SELECT, INSERT, UPDATE, DELETE, ALL
GRANT SELECT ON ALL TABLES IN SCHEMA public TO appна все существующие таблицы схемы
GRANT USAGE ON SEQUENCE orders_id_seq TO appнужно для INSERT в таблицу с serial
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO appправа на таблицы, созданные в будущем
ALTER TABLE orders OWNER TO appсменить владельца
REVOKE SELECT ON orders FROM appотозвать право
DROP ROLE appудалить роль (сначала отзови её права)

Утилиты рядом с psql

КомандаЧто делает
createdb база / dropdb базасоздать / удалить базу
createuser --login --pwprompt имясоздать роль с паролем
pg_isready [-h хост]принимает ли сервер подключения (код 0 — да)
pg_dump база > dump.sqlвыгрузка базы в SQL; -Fc — в сжатый формат для pg_restore
pg_restore -d база dump.fileзагрузка из формата -Fc

Переменные окружения

PGHOST, PGPORT, PGUSER, PGDATABASE, PGPASSWORD заменяют соответствующие флаги. Пароль можно хранить в ~/.pgpass строкой хост:порт:база:роль:пароль; файл должен иметь права 600, иначе psql его проигнорирует.

Примеры

# запустить сервер в песочнице и проверить, что он принимает подключения
service postgresql start
pg_isready

# root не является ролью PostgreSQL — работаем от системного пользователя postgres
sudo -u postgres psql -c '\l'

# создать базу и посмотреть её таблицы
sudo -u postgres createdb shop
sudo -u postgres psql -d shop -c '\dt'

# структура таблицы
sudo -u postgres psql -d shop -c '\d orders'

# одно значение без рамок — удобно присвоить переменной
count=$(sudo -u postgres psql -d shop -Atc 'SELECT count(*) FROM orders')

# выполнить файл одной транзакцией и остановиться на первой ошибке
sudo -u postgres psql -d shop -1 -v ON_ERROR_STOP=1 -f schema.sql

# подключиться по TCP под другой ролью; пароль — из переменной окружения
PGPASSWORD='secret' psql -h localhost -U app -d shop -c 'SELECT current_user'

# то же через URI
psql 'postgresql://app:secret@localhost:5432/shop' -c '\conninfo'

# выгрузить результат в CSV-файл на стороне клиента
sudo -u postgres psql -d shop -c "\copy (SELECT * FROM orders) TO '/tmp/orders.csv' CSV HEADER"

# резервная копия и восстановление в другую базу
sudo -u postgres pg_dump -Fc shop > /tmp/shop.dump
sudo -u postgres createdb shop_copy
sudo -u postgres pg_restore -d shop_copy /tmp/shop.dump

Выдача прав роли на чтение:

CREATE ROLE app LOGIN PASSWORD 'secret';
GRANT CONNECT ON DATABASE shop TO app;
GRANT USAGE ON SCHEMA public TO app;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO app;

Подводные камни

  • role "root" does not exist. Без -U клиент берёт имя пользователя ОС. Под root работай через sudo -u postgres psql или указывай -U.
  • Сокет и TCP аутентифицируются по-разному. Без -h используется метод peer: имя роли должно совпадать с пользователем ОС. С -h localhost спрашивается пароль. Правила — в pg_hba.conf (путь покажет SHOW hba_file). После правки нужна перезагрузка конфигурации сервера.
  • Без -d база = имя роли. psql -U app упадёт с database "app" does not exist, если такой базы нет.
  • Несколько -c не прерываются на ошибке, и код возврата всё равно 0. В скриптах добавляй -v ON_ERROR_STOP=1.
  • GRANT … ON ALL TABLES касается только уже существующих таблиц. Таблицы, созданные позже, останутся недоступны. Для них нужен ALTER DEFAULT PRIVILEGES — он действует на таблицы, которые потом создаст роль, выполнившая эту команду.
  • INSERT в таблицу с serial требует ещё и права на последовательность: GRANT USAGE ON SEQUENCE ….
  • DROP ROLE откажет, пока у роли есть права или объекты: role … cannot be dropped because some objects depend on it. Сначала отзови права (REVOKE) или в каждой базе выполни REASSIGN OWNED BY роль TO postgres и DROP OWNED BY роль.
  • Имена без кавычек приводятся к нижнему регистру. SELECT * FROM Orders ищет orders, а "Orders" — именно с заглавной. Строки пиши в одинарных кавычках.
  • COPY … FROM '/путь' читает файл на сервере от имени процесса PostgreSQL и требует особых прав. Файл на своей стороне загружай через \copy.
  • Переменные :имя не подставляются в -c. Они работают в файлах (-f) и в интерактивной консоли.

См. также

sqlite3 · sudo · service · variables