Зачем я полезла в Postgres
Потому что так делают взрослые. В туториалах сразу Docker Compose, два сервиса, миграции Alembic, пул соединений. Для бота, у которого один пользователь — я. Через две недели я поняла, что чиню оркестрацию чаще, чем пишу фичи.
Откатилась на файл meals.db рядом с ботом. Бэкап — это
cp в cron. Восстановление — положить файл обратно. Сервис один.
Когда SQLite — правильный выбор
- Один писатель, или редкие записи (бот, CLI, личный дашборд)
- Данные живут на той же машине, что и код
- Нужен бэкап без ритуала: скопировал файл
- Читателей много можно — WAL это умеет
Когда нет: несколько серверов пишут одновременно, нужна репликация из коробки, или вы уже измерили, что упираетесь в один диск. Не «на всякий случай».
PRAGMA journal_mode=WAL и PRAGMA busy_timeout=5000.
Без них параллельный SELECT во время INSERT ловит database is locked.
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, справа (ну, снизу) — что вернул бы движок.
Данные игрушечные, логика настоящая.
Нужен ли тебе Postgres?
Короткий тест. Без правильных ответов — только с честными.
Итог
SQLite — самая деплоенная база в мире не потому, что все ошиблись. Потому что большинство задач — это один процесс и файл. Postgres я подниму, когда появятся второй писатель и повод. Пока повода нет.
Сложность надо заслужить нагрузкой, а не резюме.