Особенности 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 и переход на серверную СУБД при росте нагрузки.