Раздел 33 · PostgreSQL с нуля

psql и мета-команды

junior~20 мин

без входаВойди, чтобы отмечать прогресс, вести заметки и решать задачи в редакторе. войти

В прошлом уроке мы подключились к серверу и увидели приглашение postgres=#. Дальше с ним можно говорить на SQL, но в psql есть и второй язык: короткие команды с обратной косой чертой. Они отвечают на вопросы «какие тут есть базы», «что лежит в этой таблице» и «сколько шёл запрос». Без них в psql работаешь вслепую.

Пульт и телевизор

У телевизора есть каналы, а у пульта кнопки. Кнопкой «громче» ты не меняешь передачу, ты настраиваешь то, как её смотришь. Каналы приходят с телестудии, кнопки работают прямо в комнате.

В psql так же. Команды SQL (SELECT, CREATE TABLE) psql отправляет серверу: это каналы. А команды, которые начинаются с обратной косой черты, psql выполняет сам, у себя: это кнопки пульта. Их называют мета-командами.

Отсюда два правила, которые экономят много нервов:

  • Мета-команда заканчивается концом строки. Точка с запятой ей не нужна.
  • Команда SQL заканчивается точкой с запятой. Пока её нет, psql ждёт продолжения.

Второе правило ловит каждого новичка. Ты пишешь SELECT 1, жмёшь Enter, и ничего не происходит, только приглашение поменялось:

postgres=# SELECT 1
postgres-#

Знак -# вместо =# значит «команда не закончена, продолжай». Допиши ; и нажми Enter. А если запутался в недописанном запросе, \r очистит его.

Главные кнопки

Где я и что тут есть

\l показывает список баз кластера:

                                                    List of databases
   Name    |  Owner   | Encoding | Locale Provider |  Collate   |   Ctype    | Locale | ICU Rules |   Access privileges
-----------+----------+----------+-----------------+------------+------------+--------+-----------+-----------------------
 bookshop  | postgres | UTF8     | libc            | en_US.utf8 | en_US.utf8 |        |           |
 postgres  | postgres | UTF8     | libc            | en_US.utf8 | en_US.utf8 |        |           |
 template0 | postgres | UTF8     | libc            | en_US.utf8 | en_US.utf8 |        |           | =c/postgres          +
...

\c имя_базы переключает на другую базу. В PostgreSQL один сеанс работает ровно с одной базой, поэтому «перейти» в другую значит переподключиться:

postgres=# \c bookshop
You are now connected to database "bookshop" as user "postgres".
bookshop=#

Приглашение сменилось на bookshop=#, теперь все команды идут сюда. \conninfo напомнит, куда и под кем ты подключён.

Что лежит в базе

\dt выводит таблицы:

          List of tables
 Schema | Name  | Type  |  Owner
--------+-------+-------+----------
 public | books | table | postgres
(1 row)

\d books описывает одну таблицу: колонки, их типы, обязательность, значения по умолчанию и индексы.

                  Table "public.books"
 Column |     Type     | Collation | Nullable | Default
--------+--------------+-----------+----------+---------
 id     | integer      |           | not null |
 title  | text         |           | not null |
 author | text         |           | not null |
 price  | numeric(8,2) |           |          |
Indexes:
    "books_pkey" PRIMARY KEY, btree (id)

Это самая частая команда psql. Перед тем как писать запрос к незнакомой таблице, посмотри её через \d.

Семейство \d большое, и буква после d говорит, что показать: \dn схемы, \du роли, \di индексы, \dv представления, \df функции. Знак + в конце добавляет подробности: \dt+ покажет ещё и размер таблиц.

Как показать результат

Широкая строка не помещается в экран и разъезжается. \x включает расширенный режим: каждая строка печатается столбиком.

bookshop=# \x
Expanded display is on.
bookshop=# SELECT * FROM books WHERE id = 1;
-[ RECORD 1 ]--------------
id     | 1
title  | Мастер и Маргарита
author | Булгаков
price  | 690.00

Повторный \x выключает режим. А \x auto сам решает, когда включаться: если таблица влезает в ширину терминала, она печатается как обычно.

\timing включает замер времени. После каждого запроса psql пишет, сколько он шёл:

bookshop=# SELECT count(*) FROM books;
 count
-------
     3
(1 row)

Time: 0.180 ms

Работа с файлами и редактором

  • \i файл.sql выполняет команды из файла. Так накатывают заранее написанные скрипты: создать таблицы, залить тестовые данные.
  • \e открывает последний запрос во внешнем редакторе. Длинный запрос удобнее править там, после сохранения и выхода psql выполнит его.
  • \q выходит из psql.

Если забыл

Запоминать всё не нужно, справка всегда под рукой:

  • \? выводит список всех мета-команд с короткими описаниями.
  • \h CREATE DATABASE показывает синтаксис команды SQL и ссылку на документацию.

Ещё psql дописывает имена по клавише Tab: начни SELECT * FROM bo и нажми Tab. Стрелка вверх листает историю команд.

урок из курса

Урок из курса «PostgreSQL с нуля». Курс покупается один раз и остаётся навсегда: 500 ₽.

Оплата пока не подключена: премиум и курсы открываются промокодом.