Особенности SQLite и работа из кода

Подводим итоги: где SQLite силён, где нет и как использовать его из программы.

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

Хранение в одном файле: плюсы и минусы

Главная идея SQLite — вся база в одном файле. Это даёт удобства: базу легко создать, скопировать, переслать, положить в систему контроля версий. Не нужны установка сервера, настройка прав и сети. Но из той же идеи вытекают ограничения.

Сильная сторонаОбратная сторона
Ноль настройки, база — файлнет доступа по сети между серверами
Очень быстрая на чтениезапись блокирует базу: один писатель за раз
Крошечная и встроеннаянет ролей и тонких прав доступа
Транзакции ACIDдинамическая типизация прощает ошибки в данных

Когда SQLite НЕ подходит

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

Работа из кода: Python и модуль sqlite3

SQLite встроен в стандартную библиотеку Python — модуль sqlite3, ставить ничего не нужно. Логика всегда одна: подключиться к файлу, получить курсор, выполнять SQL, при изменениях вызвать commit(), в конце закрыть соединение. Особое внимание — параметрам запроса: значения подставляют через ?, а не склейкой строк, иначе открывается дыра для SQL-инъекций.

import sqlite3

# подключение к файлу (или :memory: для базы в ОЗУ)
con = sqlite3.connect("shop.db")
cur = con.cursor()

cur.execute("CREATE TABLE IF NOT EXISTS products (id INTEGER PRIMARY KEY, name TEXT, price INTEGER)")

# значения через ? — защита от SQL-инъекций
cur.execute("INSERT INTO products (name, price) VALUES (?, ?)", ("Клавиатура", 2500))
con.commit()

for row in cur.execute("SELECT name, price FROM products"):
    print(row)

con.close()

Вывод:

('Клавиатура', 2500)

Запрос вернул строку как кортеж Python. По такому же принципу SQLite работает в большинстве языков — везде есть готовый драйвер, а сам SQL остаётся тем, что вы выучили в этом курсе.

Что дальше

  • Изучите режим WAL (write-ahead logging) — он улучшает параллельность чтения и записи.
  • Разберите оконные функции и общие табличные выражения (WITH ... AS, CTE) глубже.
  • Попробуйте полнотекстовый поиск (расширение FTS5) и хранение JSON (функции json_*).
  • Когда упрётесь в ограничения одного файла — осваивайте PostgreSQL: SQL вы уже знаете.

Итог

  • SQLite силён простотой и локальностью; слаб в сетевом доступе и параллельной записи.
  • Из Python работают через стандартный модуль sqlite3; значения подставляйте через ?.
  • Дальше — WAL, CTE, оконные функции, FTS5 и переход на серверную СУБД при росте нагрузки.
Проверьте себя
1. В каком случае стоит выбрать PostgreSQL вместо SQLite?
AДля локального хранилища мобильного приложения
BКогда много серверов пишут в базу одновременно по сети
CДля одноразовых тестов
DДля прототипа на ноутбуке
2. Почему в Python значения в запрос подставляют через ?, а не склейкой строк?
AТак короче писать
BЧтобы защититься от SQL-инъекций
CИначе запрос не выполнится
DЧтобы ускорить запрос в 10 раз
3. Какое ограничение вытекает из хранения базы в одном файле?
AНельзя создавать таблицы
BВ каждый момент писать в базу может только один процесс
CНельзя использовать SELECT
DБаза не может быть больше 1 МБ
Поддержать проект