Открой на телефоне список контактов, историю браузера или переписку в мессенджере. Скорее всего, под каждым из этих экранов лежит один и тот же движок базы данных, и ты ни разу его не устанавливал. Это SQLite. Раздел про то, как с ним работать: от первой таблицы до запросов, которыми пользуются в настоящих программах. Попутно ты выучишь SQL, язык, на котором говорят почти все реляционные базы.
Библиотекарь и записная книжка
Представь две библиотеки. В первой книги выдаёт библиотекарь. Ты подходишь к стойке, просишь книгу, он уходит в хранилище и возвращается с ней. К стойке стоит очередь из сотни читателей, и библиотекарь следит, чтобы двое не взяли один экземпляр. Так устроены серверные базы: PostgreSQL, MySQL, Oracle. Про них есть урок о том, из чего состоит СУБД.
Во второй библиотеке библиотекаря нет. Есть записная книжка, которую ты носишь в кармане. Открыл, нашёл, дописал, закрыл. Ни очереди, ни стойки. Записную книжку можно скопировать и отдать другу целиком.
SQLite это записная книжка.
Что такое SQLite
SQLite это база данных, которая работает внутри твоей программы. Её не запускают отдельно и к ней не подключаются по сети. Программа подключает к себе библиотеку SQLite и вызывает её функции, как вызывала бы функцию сортировки. Такие базы называют встраиваемыми.
Вся база, со всеми таблицами и индексами, лежит в одном обычном файле. Файл можно скопировать флешкой, отправить почтой, положить рядом с программой. Формат файла один на все системы: базу, созданную на ноутбуке с Linux, без переделок откроет телефон на Android.
При этом SQLite настоящая реляционная база. В ней таблицы, строки и столбцы, запросы на SQL, транзакции и индексы. Почти всё, что ты выучишь здесь, пригодится и в PostgreSQL: язык почти один и тот же.
Сервер против библиотеки
Сравним, как программа попадает к данным в двух мирах.
| Серверная база (PostgreSQL) | SQLite | |
|---|---|---|
| где работает | отдельная программа, часто на другой машине | внутри твоей программы |
| как достать данные | подключиться по сети, отправить запрос | вызвать функцию библиотеки |
| где лежат данные | папка с файлами, которой управляет сервер | один файл |
| установка | поставить сервер, завести пользователей и пароли | ничего, библиотека уже в программе |
| сколько пишут одновременно | сотни клиентов | один писатель за раз |
Последняя строка важна. Пока одна программа записывает в файл SQLite, остальные ждут своей очереди на запись. Читать при этом можно сколько угодно. Для телефона, где пишет одно приложение, это не проблема. Для интернет-магазина с тысячей покупателей в минуту, которые одновременно оформляют заказы, это узкое место. К тому, как SQLite справляется с очередью писателей, вернёмся в уроке про транзакции.
Где живёт SQLite
SQLite называют самой распространённой базой данных в мире, и это не реклама. Она есть:
- в каждом телефоне на Android и iOS: контакты, сообщения, настройки приложений;
- в браузерах Chrome, Firefox и Safari: история, закладки, cookie;
- в языках программирования: модуль
sqlite3в стандартной библиотеке Python,node:sqliteв Node.js; - в настольных программах, играх, автомобилях и даже самолётах.
Создатели оценивают число работающих баз SQLite в триллион. Большинство из них никто не видит: они лежат внутри программ и тихо делают своё дело.
Когда SQLite не подходит
У записной книжки есть пределы. SQLite плохо подходит, если:
- много клиентов по сети пишут в базу одновременно, как в интернет-магазине или банке;
- данных больше, чем помещается на одном диске одной машины;
- к базе нужно пускать разных людей с разными правами: пользователей и паролей в SQLite нет, права решает доступ к файлу.
Во всех остальных случаях SQLite часто лучше сервера: меньше движущихся частей, нечего настраивать, нечему падать. Руководство SQLite формулирует это так: SQLite конкурирует не с серверными базами, а с функцией fopen(), то есть с обычной записью данных в файл.
Кофейня «Пенка»
Весь раздел мы работаем с одной учебной базой: маленькой кофейней «Пенка». В ней пять таблиц:
drinks: напитки, их категории, цены и объёмы;customers: постоянные гости с картой лояльности;staff: сотрудники, от управляющей до кассира;orders: заказы, кто и когда их сделал;order_items: что входило в каждый заказ.
Данные нарочно неидеальные. У нового напитка ещё нет цены, объём одного напитка записан строкой, часть заказов сделали гости без карты. В настоящих базах так бывает всегда, и учиться лучше на таких данных.
Чтобы спросить базу, сколько стоят напитки, пишут запрос на SQL:
sqlite> SELECT name, price FROM drinks LIMIT 3;
╭───────────┬───────╮
│ name │ price │
╞═══════════╪═══════╡
│ Эспрессо │ 120 │
│ Американо │ 150 │
│ Капучино │ 190 │
╰───────────┴───────╯
sqlite> это приглашение утилиты sqlite3: так она показывает, что ждёт команду. Сам запрос читается почти как английская фраза: выбери (SELECT) название и цену из (FROM) напитков, первые три (LIMIT 3). Каждую часть этого запроса мы разберём в уроках про выборку, а утилиту sqlite3 в следующем уроке.
Попробуй сам
Ниже песочница: настоящий SQLite, скомпилированный для браузера, и та же утилита sqlite3, что и на компьютере. База «Пенки» уже загружена. Нажми «выполнить» и посмотри, какая версия SQLite работает, какие таблицы есть в базе и какие напитки дешевле 150 рублей.
Строка .tables начинается с точки: это не SQL, а команда самой утилиты, она печатает список таблиц. Поменяй 150 на 200 и запусти снова. Если что-то сломается, кнопка «сбросить базу» вернёт всё как было.
Проверь себя
Задание
Дальше
Песочница в браузере удобна, но настоящая работа идёт в терминале. В следующем уроке ставим утилиту sqlite3, создаём файл базы и учимся её командам.
домашка