SQLite: что это за база данных и как с ней работать

SQLite: что это за база данных и как с ней работать Полезное

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

Дальше разберу, чем SQLite отличается от серверных СУБД вроде MySQL и PostgreSQL, где ее уместно применять, покажу рабочий пример на Python с фактическим выводом и назову случаи, когда SQLite брать не стоит.

Что значит «встраиваемая» и «файловая»

Большинство известных СУБД работают по клиент-серверной модели. Есть отдельный процесс-сервер (демон), который держит данные и обрабатывает запросы, и есть клиенты, которые подключаются к нему по сети или локальному сокету. Так устроены MySQL и PostgreSQL.

SQLite устроена иначе. Это не отдельный процесс, а библиотека на языке C, которую приложение подключает к себе. Движок работает внутри того же процесса, что и программа, а вся база — таблицы, индексы, связи — лежит в одном файле на диске. Обмен идет не по сети, а через вызовы функций библиотеки.

Отсюда два ключевых свойства. Встраиваемая — значит движок является частью приложения, а не внешней службой. Файловая — значит база данных это один переносимый файл, который можно скопировать, приложить к письму или положить в репозиторий.

Различать эти уровни важно, чтобы не путать SQLite с «облегченным MySQL»: это не урезанный сервер, а принципиально другая архитектура без сервера как такового.

Чем SQLite отличается от MySQL и PostgreSQL

Разница не в том, что одна СУБД «лучше» другой, а в модели работы. Она и определяет, что выбрать под задачу.

Признак SQLite MySQL / PostgreSQL
Архитектура встраиваемая библиотека отдельный сервер (демон)
Хранение один файл на диске данные под управлением сервера
Нужен сервер нет да, ставится и настраивается
Доступ по сети нет, только локальный файл да, удаленные клиенты
Одновременная запись один писатель в момент времени много писателей параллельно
Настройка нулевая, работает из коробки установка, пользователи, права
Где типично мобильные, десктоп, встраивание веб-бэкенды, многопользовательские системы

Главная практическая граница — одновременная запись. SQLite на время записи блокирует базу целиком, поэтому в один момент писать может только один поток или процесс (чтение при этом может идти параллельно, особенно в режиме WAL). MySQL и PostgreSQL рассчитаны на множество параллельных писателей и используют для этого блокировки на уровне строк и многоверсионность (MVCC).

Проще говоря: SQLite отлично подходит, когда пишет в основном один клиент, а читают многие. Как только нужна интенсивная конкурентная запись от множества клиентов — это территория серверных СУБД.

Где применяется SQLite

SQLite не конкурирует с серверными СУБД, а закрывает свою нишу — локальное хранилище рядом с приложением. Отсюда типовые сценарии.

  • Мобильные приложения. SQLite встроена в Android и iOS, на ней держат локальные данные почти все мобильные программы: история, кэш, настройки, офлайн-контент.
  • Десктопные программы. Браузеры, почтовые и офисные клиенты, медиатеки хранят свои данные в SQLite-файле рядом с приложением, без установки сервера пользователем.
  • Прототипы и небольшие сайты. Пока проект маленький и пишет в базу редко, SQLite позволяет стартовать без разворачивания сервера БД.
  • Тесты. Базу для автотестов удобно поднимать в SQLite (в том числе целиком в памяти) — она создается за миллисекунды и не требует внешней инфраструктуры.

SQLite входит по умолчанию в мобильные ОС и в состав Windows, а работа с ней встроена в стандартную библиотеку многих языков — например, в Python модуль sqlite3 доступен без установки пакетов.

Пример: создаем базу и делаем запросы на Python

Покажу минимальный полный пример: он создает файл базы, таблицу, добавляет строки и читает их. Код на Python 3 (модуль sqlite3 из стандартной библиотеки), запускается как есть.

import sqlite3

# 1. Подключаемся к файлу БД. Если shop.db нет - он создается.
conn = sqlite3.connect("shop.db")
cur = conn.cursor()

# 2. Создаем таблицу (IF NOT EXISTS - чтобы повторный запуск не падал)
cur.execute("""
CREATE TABLE IF NOT EXISTS products (
    id    INTEGER PRIMARY KEY,
    name  TEXT NOT NULL,
    price INTEGER
)
""")

# 3. Добавляем строки. ? - плейсхолдеры, защита от SQL-инъекций.
cur.executemany(
    "INSERT INTO products (name, price) VALUES (?, ?)",
    [("Клавиатура", 2500), ("Мышь", 1200), ("Монитор", 18000)],
)
conn.commit()

# 4. Читаем товары дороже 2000 рублей
cur.execute("SELECT name, price FROM products WHERE price > 2000 ORDER BY price")
for name, price in cur.fetchall():
    print(f"{name}: {price} руб")

# 5. Агрегат по всей таблице
cur.execute("SELECT COUNT(*), SUM(price) FROM products")
count, total = cur.fetchone()
print(f"товаров: {count}, сумма: {total} руб")

conn.close()

Фактический вывод в консоли:

Клавиатура: 2500 руб
Монитор: 18000 руб
товаров: 3, сумма: 21700 руб

Мышь за 1200 в выборку не попала — ее отсек WHERE price > 2000. После запуска рядом со скриптом появится файл shop.db — это и есть вся база данных, ее можно скопировать или открыть другой программой.

Разберу по шагам. connect("shop.db") открывает файл или создает его, если файла нет. execute выполняет один SQL-запрос, executemany — тот же запрос для списка значений. commit фиксирует изменения на диск. Плейсхолдеры ? подставляют значения безопасно, поэтому не нужно склеивать SQL строками вручную.

Те же операции доступны и без Python — через консольную утилиту sqlite3, где SQL вводится прямо в терминале. Утилита ставится штатно: в Linux командой sudo apt install sqlite3, в macOS через Homebrew командой brew install sqlite, в Windows скачивается с официального сайта.

Когда SQLite не подходит

SQLite — не универсальная замена серверным СУБД. Есть случаи, где ее ограничения становятся проблемой.

  • Высокая конкурентная запись. Если в базу одновременно и часто пишут много клиентов (нагруженный веб-сервис, где каждый запрос меняет данные), блокировка базы на запись станет узким местом. Здесь нужны MySQL или PostgreSQL.
  • Доступ по сети от многих машин. SQLite — локальный файл. Держать общую базу для нескольких серверов приложений через сетевую файловую систему не стоит: блокировки по сети работают ненадежно.
  • Тонкое разграничение прав и роли. У SQLite нет пользователей и прав доступа на уровне СУБД: доступ определяется правами на файл. Где нужны роли, аудит, права на таблицы — это к серверным СУБД.

Ориентир простой: пишет в основном один процесс и данные живут рядом с приложением — подойдет SQLite; много параллельных писателей и удаленный многопользовательский доступ — серверная СУБД.

Выводы

  • SQLite — это встраиваемая реляционная СУБД, которая хранит всю базу в одном файле и работает без отдельного сервера.
  • От MySQL и PostgreSQL ее отличает архитектура: не клиент-серверный демон, а библиотека внутри процесса приложения; отсюда нулевая настройка и переносимый файл базы.
  • Основная граница применимости — конкурентная запись: SQLite блокирует базу на запись целиком, поэтому хороша там, где пишет в основном один клиент, а читают многие.
  • Типичные сценарии — мобильные и десктопные приложения, прототипы и тесты; для нагруженной параллельной записи и сетевого многопользовательского доступа берут серверные СУБД.
  • Работать с SQLite можно из кода (в Python — встроенный модуль sqlite3) или через консольную утилиту sqlite3, при этом язык запросов — обычный SQL.

Где применяется / связь с практикой

SQLite — удобная точка входа в базы данных: язык запросов тот же SQL, что в серверных СУБД, но без возни с установкой сервера. Разобравшись с SELECT, WHERE, JOIN и агрегатами на SQLite, вы применяете эти же навыки в MySQL и PostgreSQL — разница в основном в администрировании и масштабе, а не в самих запросах.

Освойте тему на практике

Освоить SQL системно — от базовых запросов до джойнов, индексов и оптимизации — можно на курсе sql в Otus. Посмотреть формат и уровень занятий, не оплачивая курс, помогут бесплатные вебинары — там разбирают конкретные запросы и отвечают на вопросы.

Смежные темы: СУБД: определение и лучшие приложения, Введение в SQL: что требуется знать новичку, Реляционные базы: определение, примеры, особенности.

FAQ

Какие типы данных поддерживает SQLite?
Пять классов хранения: NULL, INTEGER (целые), REAL (дробные), TEXT (текст) и BLOB (двоичные данные). Типизация динамическая: тип привязан к значению, а объявление столбца задает лишь предпочтительный тип (type affinity), поэтому привычных отдельных типов вроде отдельного BOOLEAN или DATE нет — их хранят как числа или текст.

Сколько весит SQLite и сколько стоит?
Сам движок — это компактная библиотека размером порядка сотен килобайт, а не мегабайты. SQLite — общественное достояние (public domain), использовать ее в любых проектах, включая коммерческие, можно бесплатно; платной является только опциональная техническая поддержка от разработчиков.

Можно ли использовать SQLite как основную базу для сайта?
Для небольшого сайта или сервиса с редкой записью — да. Как только появляется интенсивная одновременная запись от многих пользователей, стоит переходить на MySQL или PostgreSQL: SQLite блокирует базу на запись целиком и станет узким местом.

OTUS Журнал