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

Что такое SQLite

junior~15 мин

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

Открой на телефоне список контактов, историю браузера или переписку в мессенджере. Скорее всего, под каждым из этих экранов лежит один и тот же движок базы данных, и ты ни разу его не устанавливал. Это 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, создаём файл базы и учимся её командам.

домашка

Домашка