Receitas¶
As receitas resolvem um problema pontual de cada vez — código completo, copy-paste, com a teoria do por quê logo ao lado. São o complemento prático do Tutorial: o tutorial te ensina os conceitos em ordem; as receitas mostram como aplicá-los em situações reais do dia a dia.
Como ler
Cada receita é independente — pule direto pra que você precisa. Todas assumem que você já passou pelo Tutorial (modelos, queries, execução).
Disponíveis¶
| Receita | Resolve |
|---|---|
| Chaves estrangeiras e UNIQUE | FK, UNIQUE de coluna e constraints de tabela (composto/nomeado), estilo SQLAlchemy. |
| created_at / updated_at | Timestamps gerenciados pelo banco, sem lembrar de setar na mão. |
| Mixins de modelo | withTimestamps, withSoftDelete, withAudit — as colunas repetidas em toda tabela, declaradas uma vez. |
| Paginação tipada | Listas paginadas com total/páginas, alinhadas ao tempest-fastapi-sdk. |
| Agregações e DISTINCT | count/sum/avg/min/max + GROUP BY tipado e DISTINCT. |
| Upsert (ON CONFLICT) | Inserir resolvendo conflito de chave: DO NOTHING ou DO UPDATE. |
| Active-record (opt-in) | Métodos save/update/delete/reload numa linha, quando você prefere. |
| Unit of work (opt-in) | Identity map + flush em lote, numa transação. O padrão continua objeto simples. |
| Logging e erros | Ver o SQL que roda (onQuery) e erros com o SQL/params que falharam. |
| Erros de integridade (409) | Ler o erro do driver de volta para a constraint que recusou a escrita. |
| Signals do repositório | preSave/postSave/preDelete/postDelete — reagir a escrita sem envolver todo call site. |
| Trilha de auditoria | Uma entrada por mudança, com diff antes/depois, na mesma transação. |
| Escolhendo o driver do SQLite | node:sqlite (padrão) ou better-sqlite3, pela opção do engine ou pelo sufixo da URL. |
| Transações e savepoints | Operações atômicas com commit/rollback automático e pontos de salvamento. |
| Colunas JSON e enum | Guardar objetos tipados e uniões literais com segurança de tipos. |
| Tipos de coluna próprios | customType — Money, Temporal, id com brand: a conversão mora na coluna. |
| Serialização (linha ↔ JSON) | Converter linhas pra JSON e validar JSON de volta pra linha. |
| Conectando ao PostgreSQL | Trocar SQLite por Postgres pela URL e ajustar o pool. |
| Fila durável com PostgreSQL | FOR UPDATE SKIP LOCKED, contador atômico e idempotência por índice parcial. |
| Outbox transacional | Linha de negócio e evento no mesmo commit; relay com lotes disjuntos. |
| Nomes de coluna | Schema em snake_case com modelo em camelCase, sem drift falso. |
| Colunas array do PostgreSQL | text[]/integer[] tipados, com @>, <@ e &&. |
| Comparação case-insensitive | ieq para login sem diferenciar caixa — e a armadilha do ilike. |
| Busca de texto | contains escapado e portátil; fullText/fullTextRank com stemming no PostgreSQL. |
| SQL cru em runtime | session.raw para a query que o builder ainda não expressa. |
Expressões no where |
Coluna vs coluna e funções SQL, para casar índice funcional. |
| Operações de conjunto | UNION, UNION ALL, INTERSECT, EXCEPT com a forma dos ramos checada no tipo. |
| Funções de janela | rowNumber, rank, lag/lead e agregação em janela, via compute(). |
| CTE (WITH e WITH RECURSIVE) | Nomear uma consulta e percorrer árvore numa query só. |
| MySQL: o que muda | RETURNING por read-back e o que o MySQL não faz. |
Procurando algo maior?¶
Se você quer ver tudo junto num projeto que roda, vá pra Exemplos: um Todo CLI, um blog com relations, uma REST API e o fluxo completo de migrações.