Раздел 35 · SQLite с нуля

Утилита sqlite3 и создание базы

junior~20 мин

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

В прошлом уроке мы выяснили, что 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 ответ неожиданный: в следующем уроке разбираем типы данных и динамическую типизацию.

домашка

Домашка