Зачем я полезла в 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, справа (ну, снизу) — что вернул бы движок.
Данные игрушечные, логика настоящая.
SELECT name, sql FROM sqlite_master
WHERE type = 'table';
SELECT spot, minutes FROM naps
WHERE date(started) = date('now');
SELECT spot, round(avg(minutes), 1) AS avg_min
FROM naps
GROUP BY spot
ORDER BY avg_min DESC;
SELECT n.spot, m.what
FROM naps n
JOIN meals m ON date(n.started) = date(m.ts)
WHERE n.minutes > 30;
| name | sql |
|---|---|
| naps | CREATE TABLE naps (id, started, minutes, spot) |
| meals | CREATE TABLE meals (id, ts, what) |
| spot | minutes |
|---|---|
| клавиатура | 42 |
| подоконник | 18 |
| клавиатура | 7 |
| spot | avg_min |
|---|---|
| клавиатура | 31.4 |
| подоконник | 22.0 |
| коробка с проводами | 14.5 |
| spot | what |
|---|---|
| клавиатура | курица |
| клавиатура | сухой корм (увы) |
Нужен ли тебе Postgres?
Короткий тест. Без правильных ответов — только с честными.
Итог
SQLite — самая деплоенная база в мире не потому, что все ошиблись. Потому что большинство задач — это один процесс и файл. Postgres я подниму, когда появятся второй писатель и повод. Пока повода нет.
Сложность надо заслужить нагрузкой, а не резюме.