SQLite — это база данных прямо внутри вашей программы
Большинство известных вам СУБД — MySQL, Postgres, SQL Server — работают как отдельный процесс. Запускаете сервер, он слушает порт, а приложение по сети шлёт ему запросы. SQLite ломает эту схему целиком.
SQLite — это библиотека. Вы подключаете её к своему приложению и получаете полноценную SQL-базу, которая хранится в одном файле на диске. Никакого сервера, никаких портов, никаких демонов и никаких pg_ctl start. Программа просто открывает файл — и этот файл и есть база данных.
sqlite3 mydata.db
Эта команда открывает (или создаёт) файл mydata.db и кидает вас в SQL-консоль. Всё, что вы там натворите — таблицы, строки, индексы — складывается в этот один-единственный файл. Скопировали его на другую машину — и база поехала с вами. Удалили — и базы больше нет.
Краткий обзор SQL-синтаксиса
Сам SQL здесь точно такой же, как и везде. Если вы работали с другой СУБД, почти всё покажется знакомым:
Стандартный SQL — CREATE TABLE, INSERT, SELECT, ORDER BY. SQLite поддерживает ту часть стандарта SQL, которой вы реально пользуетесь каждый день, плюс современные удобства: CTE, оконные функции, функции для работы с JSON. Отличия от Postgres или MySQL сводятся в основном к типам данных и паре синтаксических нюансов — об этом ещё поговорим дальше.
Что значит «встраиваемая» и «бессерверная» на самом деле
Когда речь заходит о SQLite, постоянно всплывают два слова. С ними стоит разобраться сразу.
Встраиваемая означает, что SQLite работает в том же процессе, что и ваше приложение. Никакого отдельного процесса базы данных нет. Когда ваш Python-скрипт вызывает sqlite3.connect("data.db"), SQL-движок крутится прямо внутри процесса Python и сам читает и пишет файл.
Бессерверная означает, что нет сервера, который надо устанавливать, настраивать, запускать, защищать и бэкапить. Сравните, что нужно сделать, чтобы начать пользоваться базой:
- Postgres: поставить Postgres, запустить службу, создать пользователя, создать базу, настроить
pg_hba.conf, подключиться по TCP. - SQLite: открыть файл.
Вот и вся разница. Меньше возможностей — но и церемоний на порядок меньше.
Вся база данных — это один файл
Вот что обычно удивляет людей сильнее всего. Формат файла задокументирован и стабилен — это файл .db (или .sqlite, или .sqlite3, расширение чисто условное), который можно:
- отправить коллеге по почте;
- закоммитить в git (ну, если он небольшой);
- скопировать через
cpи получить мгновенный бэкап; - открыть в любой SQLite-утилите на любой операционной системе.
ls -lh mydata.db
# -rw-r--r-- 1 you staff 28K Apr 23 14:02 mydata.db
В одном файле хранится всё: таблицы, индексы, схема и сами данные. На диске базы SQLite побайтово одинаковы под Windows, macOS, Linux, iOS и Android. Формат настолько стабильный, что Библиотека Конгресса США рекомендует его для долговременного хранения данных.
Где вы уже пользуетесь SQLite
С высокой вероятностью прямо сейчас на вашем устройстве лежат сотни баз SQLite. На нём работают:
- системное хранилище iOS и Android, а также куча приложений на обеих платформах;
- Firefox, Chrome и Safari (история, закладки, cookies);
- macOS (Почта, Фото, Dock);
- большинство десктопных приложений в Linux, которым нужно локальное хранилище;
- Skype, WhatsApp, Signal — история переписок;
- каталоги Adobe Lightroom, метаданные Dropbox, библиотеки Steam.
SQLite называют самым массово развёрнутым движком баз данных в мире — и это, скорее всего, правда. Причина проста: когда приложению нужно структурированное локальное хранилище, SQLite — это путь наименьшего сопротивления.
Чем SQLite не является
Это не клиент-серверная СУБД. Два приложения на разных машинах не смогут одновременно подключиться к одной базе SQLite по сети — у неё попросту нет сетевого слоя, к которому можно было бы подключаться. Если такое нужно — берите Postgres или MySQL.
SQLite не рассчитан на высокую конкуренцию по записи. Используется блокировка на уровне файла (с парой умных оптимизаций в режиме WAL), поэтому читатели могут работать параллельно, а вот коммитить запись в каждый момент времени способен только один процесс. Для однопользовательского приложения или малопосещаемого сайта это вообще не проблема. Для мультитенантного SaaS с тысячами записей в секунду — это не тот инструмент.
В нём нет управления пользователями и правами. Доступ к базе — это доступ к файлу: кто может читать файл, тот читает и данные. Для приложения, которое владеет собственной базой, это нормально. Для общего мультитенантного окружения — уже нет.
Почему всё-таки SQLite
Сделка простая: вы получаете максимум простоты в обмен на запас по масштабированию, который вам, возможно, никогда не понадобится.
- Ноль настройки. Никакого сервиса не надо запускать. Никакого расхождения версий между dev и prod. Никаких «база упала», потому что сервера баз данных просто нет.
- Быстро. На большинстве нагрузок, особенно с упором на чтение, SQLite быстрее сетевой БД — на каждом запросе нет round-trip по сокету.
- Надёжно. Его тестируют до одури. В проекте SQLite тестового кода в разы больше, чем исходного, а формат файла стабилен с 2004 года.
- Public domain. Бесплатно для любых целей, включая коммерческие. Лицензию читать не нужно.
- Переносимо. Один файл — все платформы.
Для локальных приложений, прототипов, встраиваемых устройств, CLI-утилит, тестовых наборов, скриптов анализа данных и небольших или средних сайтов SQLite — это часто правильный выбор по умолчанию, а не временная подпорка перед переходом на «настоящую» базу.
Дальше: SQLite vs MySQL
Логичный следующий вопрос — как SQLite смотрится на фоне тех серверных СУБД, о которых вы наверняка слышали чаще. Начнём с MySQL: где у каждого сильные стороны и как понять, что лучше подходит под ваш конкретный проект.
Часто задаваемые вопросы
Что такое SQLite?
SQLite — это движок SQL-базы данных, который подключается к приложению как библиотека, а не работает отдельным сервером. Вся база — таблицы, индексы, схема и сами данные — хранится в одном файле на диске. Обращаться к ней можно через C-библиотеку (или биндинг для вашего языка), используя обычный SQL.
Для чего используют SQLite?
Везде, где нужна полноценная SQL-база без отдельного сервера: мобильные приложения (SQLite встроен и в iOS, и в Android), десктопные программы, браузеры, embedded-устройства, небольшие сайты, локальные кеши, тесты и аналитические скрипты. Если данные помещаются на одной машине и в каждый момент пишет только один процесс — SQLite, скорее всего, отлично подойдёт.
SQLite — это полноценная база данных?
Да. Поддерживаются транзакции, ACID, внешние ключи, JOIN'ы, подзапросы, оконные функции, CTE, триггеры, представления и JSON. Чего нет по сравнению с серверными СУБД — сетевого доступа, многопользовательской записи и учётных записей пользователей, потому что это просто не её задача. Для однопроцессного приложения SQLite ничем не уступает Postgres.
SQLite бесплатный?
Да. SQLite распространяется как public domain — это даже либеральнее, чем большинство open-source лицензий. Его можно встраивать в коммерческие продукты, изменять и распространять без всяких отчислений и упоминаний авторства. Именно поэтому это одна из самых массово используемых программ в мире.