раздел 05 · подстраница 1
SQLite: вся база в одном файле
SQLite - идеальный мостик между файлом и «настоящей» базой. Это полноценная SQL-база данных, но без сервера: вся база - это один файл app.db на диске. Никаких установок, портов, паролей. Для вайб-кодинга это лучший первый шаг в мир баз.
Что это
SQLite - библиотека, которая встроена почти везде (в Python - прямо из коробки, без установки). Вы указываете имя файла, и в нём появляется база с таблицами. Скопировали файл - скопировали всю базу. Удалили файл - удалили базу.
При этом внутри это честный SQL: таблицы, индексы, запросы, связи. Всё, чему вы научитесь на SQLite, один в один работает в PostgreSQL и MySQL.
Зачем это
- Прототип или MVP, где не хочется поднимать сервер базы.
- Десктоп- или мобильное приложение - данные у пользователя на устройстве.
- Небольшой сайт или бот с одним сервером.
- Локальная обработка данных: загрузил, разложил по таблицам, поискал.
Как это работает
Полный цикл на Python - без единой установки, модуль sqlite3 встроен.
import sqlite3
# подключаемся (файл создастся, если его нет)
conn = sqlite3.connect("app.db")
cur = conn.cursor()
# создаём таблицу один раз
cur.execute("""
CREATE TABLE IF NOT EXISTS tasks (
id INTEGER PRIMARY KEY AUTOINCREMENT,
text TEXT NOT NULL,
done INTEGER DEFAULT 0
)
""")
# добавляем запись
cur.execute("INSERT INTO tasks (text) VALUES (?)", ("купить молоко",))
conn.commit() # без commit изменения не сохранятся в файл
# читаем
cur.execute("SELECT id, text, done FROM tasks")
for row in cur.fetchall():
print(row) # (1, 'купить молоко', 0)
conn.close()
Разберём важное:
connect("app.db")создаёт файл базы, если его нет;CREATE TABLE IF NOT EXISTSсоздаёт таблицу только при первом запуске;commit()фиксирует изменения на диск - без него запись не сохранится;id INTEGER PRIMARY KEY AUTOINCREMENT- база сама присваивает уникальный номер каждой записи.
Зачем эти ? в запросе
Заметили VALUES (?) и кортеж ("купить молоко",) отдельно? Это не каприз. Так данные подставляются безопасно. Никогда не склеивайте SQL строками с пользовательскими данными:
# ОПАСНО: дыра для SQL-инъекции
cur.execute(f"INSERT INTO tasks (text) VALUES ('{user_input}')")
# ПРАВИЛЬНО: данные через параметр
cur.execute("INSERT INTO tasks (text) VALUES (?)", (user_input,))
Как посмотреть базу глазами
Файл .db бинарный, блокнотом не открыть. Чтобы заглянуть внутрь:
- расширение SQLite Viewer для VS Code - открывает
.dbкак таблицы; - программа DB Browser for SQLite - бесплатный графический клиент;
- команда
sqlite3 app.dbв терминале для тех, кто любит консоль.
Где у SQLite потолок
SQLite живёт в файле на одной машине. Он не предназначен для ситуации, когда десятки серверов или тысячи пользователей пишут одновременно через сеть. Запись блокирует файл целиком, поэтому при высокой нагрузке на запись он становится узким местом. Тогда переходят на серверную базу (PostgreSQL) - об этом отдельная страница.
Но честно: до этого потолка большинство пет-проектов и MVP так и не доходят. Начинайте с SQLite.
Антипаттерны
- Забыть
commit()- и удивляться, что после перезапуска данных нет. Запись без коммита не сохраняется. - Склеивать SQL строками - прямая дорога к инъекциям. Только параметры
?. - Тащить SQLite в высоконагруженный сервис с кучей одновременных записей - это не его сценарий, берите Postgres.