SQLite хватает чаще, чем вы думаете

Бот с напоминалками про еду живёт на SQLite уже почти год. Никакого Postgres, никакого Redis, никакого «а вдруг вырастем». Ниже — когда файл-база это правильно, и песочница с запросами из моего дневника сна.

Зачем я полезла в Postgres

Потому что так делают взрослые. В туториалах сразу Docker Compose, два сервиса, миграции Alembic, пул соединений. Для бота, у которого один пользователь — я. Через две недели я поняла, что чиню оркестрацию чаще, чем пишу фичи.

Откатилась на файл meals.db рядом с ботом. Бэкап — это cp в cron. Восстановление — положить файл обратно. Сервис один.

Когда SQLite — правильный выбор

Когда нет: несколько серверов пишут одновременно, нужна репликация из коробки, или вы уже измерили, что упираетесь в один диск. Не «на всякий случай».

⚠️ WAL и busy_timeout
Два флажка, без которых SQLite кажется «сломанным» под нагрузкой: PRAGMA journal_mode=WAL и PRAGMA busy_timeout=5000. Без них параллельный SELECT во время INSERT ловит database is locked.
db.py
import aiosqlite

async def connect(path: str = "meals.db"):
    db = await aiosqlite.connect(path)
    await db.execute("PRAGMA journal_mode=WAL")
    await db.execute("PRAGMA busy_timeout=5000")
    await db.execute("PRAGMA foreign_keys=ON")
    db.row_factory = aiosqlite.Row
    return db

Потыкать запросы

Это срез из naps.db — я логирую, когда засыпаю на клавиатуре. Кнопки подставляют SQL, справа (ну, снизу) — что вернул бы движок. Данные игрушечные, логика настоящая.

Песочница · naps.db
Выбери запрос
naps.sql

Нужен ли тебе Postgres?

Короткий тест. Без правильных ответов — только с честными.

Решалка
Сколько процессов одновременно пишут в базу?
Данные должны пережить эту машину сами по себе?
Ответь на оба — скажу, что бы выбрала я.

Итог

SQLite — самая деплоенная база в мире не потому, что все ошиблись. Потому что большинство задач — это один процесс и файл. Postgres я подниму, когда появятся второй писатель и повод. Пока повода нет.

Сложность надо заслужить нагрузкой, а не резюме.

Была ли статья полезной?