Menu

Что такое SQLite: встраиваемая SQL-база данных

SQLite — это бессерверная SQL-база данных, которая живёт в одном файле и работает прямо внутри вашего приложения. Разбираемся, чем она отличается от обычной СУБД и где её удобно использовать.

На этой странице есть исполняемые редакторы: меняйте, запускайте и сразу видите результат.

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 лицензий. Его можно встраивать в коммерческие продукты, изменять и распространять без всяких отчислений и упоминаний авторства. Именно поэтому это одна из самых массово используемых программ в мире.

Coddy programming languages illustration

Учитесь программировать с Coddy

НАЧАТЬ