В прошлом уроке мы выяснили, что SQLite живёт внутри программ. Но чтобы посмотреть, что лежит в файле базы, писать программу не нужно. Для этого есть утилита sqlite3: окно, в котором набираешь SQL и сразу видишь ответ. Сегодня ставим её, создаём первый файл базы и учимся командам, без которых в ней неудобно.
Блокнот и ручка
Записная книжка из прошлого урока ничего не умеет сама. Чтобы в ней что-то появилось, нужна ручка. Утилита sqlite3 и есть такая ручка: она открывает файл базы, принимает от тебя команды и показывает результат.
Такие программы называют оболочкой командной строки. У PostgreSQL похожая утилита называется psql, её мы разбирали в уроке про метакоманды psql. Разница в одном: psql подключается к серверу по сети, а sqlite3 открывает файл прямо с диска.
Установка
На macOS и большинстве дистрибутивов Linux sqlite3 уже стоит. Проверь:
sqlite3 --version
Если команда не найдена, поставь утилиту менеджером пакетов:
# Debian и Ubuntu
sudo apt install sqlite3
# macOS с Homebrew
brew install sqlite
# Windows
winget install SQLite.SQLite
Ещё один путь: скачать готовый архив sqlite-tools со страницы загрузки. Внутри один исполняемый файл, его кладут в папку из PATH. Версия в менеджере пакетов бывает старше, для уроков подойдёт любая не древнее 3.35. В песочницах этого раздела работает 3.53.4.
Создаём файл базы
Базу создают одной командой: имя файла передают утилите.
sqlite3 penka.db
SQLite version 3.53.4 2026-07-24 19:02:57
Enter ".help" for usage hints.
sqlite>
Утилита напечатала версию и подсказку и ждёт ввода. Если файла penka.db не было, она его создала. Пока это пустой файл размером ноль байт: настоящая структура базы появится в нём, когда ты создашь первую таблицу. Если запустить sqlite3 без имени файла, база будет жить только в памяти и пропадёт при выходе. Утилита честно предупредит об этом строкой «Connected to a transient in-memory database».
Приглашение и точка с запятой
sqlite> это приглашение: утилита ждёт команду. Набери выражение и закончи его точкой с запятой:
sqlite> SELECT 1 + 1;
╭───────╮
│ 1 + 1 │
╞═══════╡
│ 2 │
╰───────╯
Точка с запятой говорит «запрос закончен, выполняй». Без неё sqlite3 считает, что ты ещё не дописал, и печатает приглашение продолжения. Частая ошибка новичка: нажать Enter, увидеть ...> и решить, что утилита зависла. Она ждёт точку с запятой, допиши её на новой строке:
sqlite> SELECT 'привет'
...> ;
╭──────────╮
│ 'привет' │
╞══════════╡
│ привет │
╰──────────╯
Зато длинный запрос можно разбить на строки, как удобно читать. Если открыть скобку и не закрыть её, приглашение покажет глубину вложенности: (x1...> значит «открыта одна скобка».
sqlite> CREATE TABLE notes (
(x1...> id INTEGER,
(x1...> body TEXT
(x1...> );
sqlite> INSERT INTO notes VALUES (1, 'купить зёрна');
sqlite> SELECT * FROM notes;
╭────┬──────────────╮
│ id │ body │
╞════╪══════════════╡
│ 1 │ купить зёрна │
╰────┴──────────────╯
Так же утилита подсказывает про незакрытую кавычку. Приглашение ' ...> значит, что строка в одинарных кавычках ещё не закончилась, и перевод строки попадёт внутрь значения:
sqlite> SELECT 'кофе
' ...> с молоком';
╭──────────────────╮
│ 'кофе с молоком' │
╞══════════════════╡
│ кофе │
│ с молоком │
╰──────────────────╯
Что делают CREATE TABLE и INSERT, подробно разберём в уроке про первую таблицу. Сейчас важно другое: как утилита читает многострочный ввод.
Команды с точкой
Кроме SQL утилита понимает собственные команды. Они начинаются с точки, пишутся в одну строку и не требуют точки с запятой. Такие команды называют точечными. Библиотека SQLite их не видит: их выполняет сама sqlite3.
| Команда | Что делает |
|---|---|
.tables | список таблиц |
.schema ИМЯ | команда CREATE, которой создана таблица |
.mode РЕЖИМ | как печатать результат: qbox, box, table, list, csv, line |
.headers on | печатать заголовки столбцов в режимах, где их нет |
.help | справка по всем командам |
.quit | выйти, то же делает Ctrl+D |
sqlite> .tables
notes
sqlite> .schema notes
CREATE TABLE notes (
id INTEGER,
body TEXT
);
.schema удобна, когда забыл, какие у таблицы столбцы: она печатает ту самую команду, которой таблицу создали.
Режимы вывода
Когда ты работаешь в терминале, sqlite3 рисует результат рамкой из скруглённых линий. Этот режим вывода называется qbox: таблица в рамке, а текст, который можно спутать с числом, в кавычках. Если передать запрос утилите через конвейер, например echo "SELECT * FROM notes;" | sqlite3 penka.db, она решит, что её читает другая программа, и включит режим list: значения через вертикальную черту, без рамок и заголовков. Его же можно включить вручную:
sqlite> .mode list
sqlite> SELECT * FROM notes;
1|купить зёрна
sqlite> .headers on
sqlite> SELECT * FROM notes;
id|body
1|купить зёрна
sqlite> .mode
.mode list --limits on --textjsonb on --titles on
.mode без аргументов показывает текущий режим и его настройки. Режим живёт до выхода из утилиты: при следующем запуске снова будет qbox. В песочницах раздела так же: каждый запуск начинается с режима по умолчанию.
Попробуй сам
Песочница начинает с пустой базы, как свежий файл penka.db. Создай таблицу заметок, добавь запись и посмотри на неё в двух режимах:
Режим line печатает каждый столбец на своей строке, это удобно для широких таблиц. Попробуй ещё .mode csv и .mode table, а потом убери точку с запятой в последней строке и посмотри, что изменится.
Проверь себя
Задание
Дальше
В таблице notes столбец id объявлен как INTEGER. Значит ли это, что туда нельзя записать текст? В SQLite ответ неожиданный: в следующем уроке разбираем типы данных и динамическую типизацию.
домашка