SQLite moderno: edge, mobile e backend 2026
- ⬜📊 ClickHouse: OLAP analytics de alto throughput(NoSQL + Vector Databases)
Recomendamos completar os pré-requisitos antes de seguir, mas nada te impede de continuar.
O banco mais subestimado do mundo
SQLite é o banco mais deployed da história. Está em todo iPhone, Android, browser, Firefox, Chrome, sistemas de voo da Airbus. Em 2026, renasceu na conversa de backend sério porque: (1) edge computing expôs o custo de round-trip para DB remoto, (2) Turso/libSQL tornou replicação multi-region trivial, (3) Litestream/LiteFS resolveram backup contínuo.
Configuração de produção (não default)
| Ajuste | Padrão | Produção | Por quê |
|---|---|---|---|
| Modo de escrita | Diário de reversão | Registro adiante | Permite ler enquanto se escreve — sem isso, leitor bloqueia escritor |
| Espera por bloqueio | Zero | Alguns segundos | Sem espera, concorrência normal vira erro de banco ocupado |
| Sincronismo | Total | Normal, com registro adiante | Ordens de magnitude mais rápido, com durabilidade suficiente fora de falta de energia |
| Chaves estrangeiras | Desligadas | Ligadas | Vêm desligadas por compatibilidade histórica — quase ninguém sabe |
| Cache | Pequeno | Dezenas de megabytes | Diferença grande em consulta analítica |
SQLite default é pensado para uso desktop conservador. Para app server você precisa ligar WAL e tunar alguns pragmas.
-- Rode uma vez ao abrir a conexao
PRAGMA journal_mode = WAL; -- concurrent readers + 1 writer
PRAGMA synchronous = NORMAL; -- fsync no checkpoint, nao em cada commit
PRAGMA busy_timeout = 5000; -- espera 5s se outro writer
PRAGMA cache_size = -64000; -- 64MB de cache (negativo = KB)
PRAGMA foreign_keys = ON; -- FKs nao sao ON por default (!)
PRAGMA temp_store = MEMORY; -- temp tables em RAM
PRAGMA mmap_size = 268435456; -- 256MB memory-mapped IOSem journal_mode=WAL, SQLite serializa leituras e escritas. Você testa localhost com 1 usuário e acha que é rápido; produção com 50 conexões concorrentes trava. Primeira coisa a ligar, sempre.
Uso moderno com better-sqlite3
import Database from 'better-sqlite3';
const db = new Database('app.db');
db.pragma('journal_mode = WAL');
db.pragma('synchronous = NORMAL');
db.pragma('busy_timeout = 5000');
// Prepared statement (cache interno, reusa plano)
const insertUser = db.prepare(
'INSERT INTO users (email, name) VALUES (?, ?) RETURNING id'
);
// Transacao = funcao
const insertMany = db.transaction((users: Array<{email: string; name: string}>) => {
for (const u of users) insertUser.run(u.email, u.name);
});
// 10k inserts em ~40ms
insertMany(users);
// Query tipada
const getTopPosts = db.prepare(
'SELECT id, title, score FROM posts WHERE status = ? ORDER BY score DESC LIMIT ?'
);
const rows = getTopPosts.all('published', 10) as Array<{id: number; title: string; score: number}>;Por que a configuração padrão desse banco não serve para uso sério?
libSQL / Turso: SQLite distribuído
import { createClient } from '@libsql/client';
// Local replica (le da edge, ~1ms) + sync com primary
const db = createClient({
url: 'file:local.db',
syncUrl: 'libsql://my-app.turso.io',
authToken: process.env.TURSO_AUTH_TOKEN!,
syncInterval: 60, // sync a cada 60s
});
// Reads vao para replica local
const rows = await db.execute('SELECT * FROM posts WHERE slug = ?', ['hello']);
// Writes viajam para o primary (latencia cross-region)
await db.execute('INSERT INTO views (post_id, at) VALUES (?, ?)', [1, Date.now()]);Turso cobra por branch (como Neon). Cada branch é um SQLite independente — dá para dev/staging/prod/preview efêmero. Read-latency da edge resolve problema real de app global.
Quando NÃO usar SQLite
Writes concorrentes pesados (> 100 writes/s sustentados de múltiplos clients), transações multi-writer, full-text avançado (prefira Postgres + tsvector ou Elasticsearch), extensões pesadas (PostGIS, pgvector maduro). SQLite é 1 writer por vez — assumir isso.
SQLite + WAL + Litestream resolve 80% dos apps "Postgres-first" com 10% da complexidade operacional. Vale revisitar antes de provisionar RDS.
Perguntas frequentes
❓ SQLite serve para produção em 2026?
❓ Como replicar SQLite?
❓ Qual o maior risco de usar SQLite em serviço?
Fixando
Em que cenário esse banco é uma escolha excelente e frequentemente descartada por preconceito?
O que as variantes distribuídas acrescentam ao modelo embarcado?
Terminou de ler?
Marcar como concluído registra o XP, mantém sua sequência e coloca 3 cartas deste módulo na fila de revisão espaçada.
Próximos passos sugeridos
Temas deste módulo
Discussão
Carregando comentários…