Modelagem com Drizzle ORM
Começa de fato o Módulo 3 — Dados com Supabase. No post-âncora (#18) vimos o Supabase como espinha dorsal. Agora descemos pra camada que o time toca todo dia: o Drizzle ORM, a ponte tipada entre o nosso código TypeScript e o PostgreSQL.
Por que Drizzle (e não SQL solto pelo código)
Drizzle nos dá acesso ao banco tipado de ponta a ponta: o schema é TypeScript, as queries são TypeScript, e o compilador pega o erro antes do runtime. Você escreve db.select().from(careerPosts) e o editor já sabe quais colunas existem. Pra vibe coding isso é ouro: a IA gera query e o typecheck valida na hora se ela faz sentido.
Como modelamos no ClubPetro
- O schema vive em
packages/db— 50+ tabelas organizadas por domínio (cs, finance, recruitment, gente…). - Cada tabela exporta o objeto Drizzle + os tipos inferidos (
$inferSelect/$inferInsert). Ex.:careerPosts,CareerPost,NewCareerPost. - Schemas Postgres nomeados quando faz sentido (ex.:
recruitment.career_postsviarecruitmentSchema.table(...)). - Índices e enums declarados junto da tabela, perto de onde importam.
O que a IA faz bem aqui
- Espelhar padrão. "Cria a tabela X igual à Y" — ela copia a estrutura, tipos e índices no nosso estilo.
- Gerar queries. Do
selectcom filtro aoinsert ... returning, seguindo os tipos. - Inferir tipos. Menos
any, mais tipo derivado do schema.
O cuidado que a IA não tem sozinha
Modelagem é decisão de arquitetura de dados — e isso é humano:
- A relação está certa (FK, cascade, set null)?
- Esse campo devia ser
textcom check, ou um enum de verdade? - O índice cobre as queries reais ou é peso morto?
- E a regra inegociável que vem no próximo post: RLS (#20).
A IA escreve o schema; você decide se o modelo está certo. Modelo de dados ruim é caro de mudar depois — perto de irreversível, e irreversível a gente decide devagar.
Uma verdade desconfortável do nosso repo
O schema em TS nem sempre reflete o banco. Há drift conhecido (assunto do #21). Então, antes de criar dado ou confiar no .ts, cheque o banco real (pnpm db:studio ou query direta). A regra da casa: antes de criar qualquer dado, verifique a base existente.
⚠️ Armadilha #19: confiar que o schema Drizzle em TS é a verdade do banco. Não é. Gerar código em cima de um schema desatualizado produz query que compila e quebra em produção.
Próximo da série: #20 — RLS na prática: segurança obrigatória.