Voltar para o Blog
Vibe Coding21 / 40
  1. 01O que é vibe coding (e o que não é)
  2. 02De escrever código a dirigir a intenção
  3. 03O ciclo: contexto → plano → geração → revisão
  4. 04O arsenal: visão geral do nosso stack de IA
  5. 05Quando não usar vibe coding
  6. 06Da ideia ao protótipo em horas
  7. 07Claude para brainstorm de produto e PRD
  8. 08Claude Artifacts para mockups instantâneos
  9. 09Lovable: do prompt ao app funcional
  10. 10Google AI Studio: prototipando com Gemini
  11. 11Lovable × Claude × Google Studio: quando usar cada um
  12. 12Claude Code: o par de programação que conhece o monorepo
  13. 13Anatomia de um bom prompt de engenharia
  14. 14Plan mode: planejar antes de gerar
  15. 15Skills e slash commands (/investigate, /review, /ship)
  16. 16Refactors e migrations em massa
  17. 17Debugging com IA: do stack trace à causa raiz
  18. 18Supabase: a espinha dorsal de dados
  19. 19Modelagem com Drizzle ORM
  20. 20RLS na prática: a regra que não tem exceção
  21. 21Migrations SQL à mão e o drift DB↔Drizzle
  22. 22Auth com Google OAuth no Supabase
  23. 23Realtime, Storage e o resto do Supabase
  24. 24Trigger.dev: o piloto automático
  25. 25Seu primeiro job agendado
  26. 26Workflows com retry e observabilidade
  27. 27IA em background: resumos e narrativas
  28. 28Deploy do Trigger.dev e as pegadinhas
  29. 29Evolution API: WhatsApp como canal de produto
  30. 30Instância por usuário e gestão centralizada
  31. 31IA gerando resumos de conversa
  32. 32Boas práticas e armadilhas no WhatsApp
  33. 33Integrando APIs de terceiros com IA
  34. 34Anthropic SDK: Claude dentro do produto
  35. 35Resend: e-mail transacional que chega
  36. 36Google Analytics, Search Console e Ads
  37. 37Rate limit, retry, idempotência e secrets
  38. 38GitHub: CI/CD e AI Code Review como portão de qualidade
  39. 39Deploy no Google Cloud Run
  40. 40A cultura por trás do vibe coding (e o futuro)
Vibe CodingParte 21 de 40

Migrations SQL à mão e o drift DB↔Drizzle

2 min de leitura
Compartilhar
Vibe Coding

Tem uma parte do nosso stack que contraria o tutorial padrão de Drizzle — e que, se a IA (ou um dev novo) não souber, gera erro silencioso e confusão. É como a gente lida com migrations. Este post conta a verdade do nosso repo, sem maquiagem.

O que o tutorial diz vs. o que a gente faz

O fluxo "de fábrica" do Drizzle: você altera o schema TS, roda db:generate/db:migrate e o ORM cuida do resto. Não é assim que funciona aqui.

No ClubPetro:

  • As migrations são SQL escritas à mão em packages/db/drizzle/NNNN_*.sql.
  • O _journal.json está desatualizado (para lá atrás, nos primeiros migrations).
  • Por isso, db:migrate não é o mecanismo de aplicar mudança. Quem rodar achando que "migrei" pode não ter migrado nada.

Saber disso evita a frustração clássica: "rodei o migrate e o banco não mudou".

O drift DB ↔ Drizzle

Consequência direta: o schema TypeScript nem sempre reflete o banco real. Há colunas que existem no banco e não no .ts, e vice-versa. Exemplos reais documentados internamente envolvem tabelas onde o DB tem colunas que o Drizzle não conhece.

A regra que sai disso, e que vale pra todo vibe coding com dados:

Nunca assuma que o schema TS é a verdade. Cheque o banco real antes de mexer.

Como trabalhar com isso (e com IA)

  1. Antes de criar/alterar dado, inspecione a basepnpm db:studio, query via Drizzle ou SQL no Supabase Studio. É a regra nº1 da casa: verifique o que já existe.
  2. Escreva a migration SQL à mão, no padrão NNNN_*.sql, com RLS incluído (#20).
  3. Dê esse contexto pra IA. O CLAUDE.md do packages/db documenta o drift e o processo — então o Claude Code já entra sabendo, mas confira o que ele gerar.
  4. Jamais db:push em produção. E lembre: nosso .env.local local aponta pra prod. Um db:push distraído mexe em dado real.

Por que não "arrumamos" o drift de uma vez

Tentador, mas é mudança de alto risco num banco de produção vivo — exatamente o tipo de coisa irreversível que a gente decide devagar, com dado na mão. A postura certa hoje: não aumentar o drift (toda mudança nova feita certa) e remediar com cuidado.

⚠️ Armadilha #21: rodar db:migrate ou confiar no schema TS achando que está tudo sincronizado. Aqui não está. O banco é a fonte da verdade; o .ts é uma aproximação.

Próximo da série: #22 — Auth com Google OAuth.

Curtiu como a gente pensa?

É assim que trabalhamos todo dia.

Se esse jeito de pensar é o seu, vem construir com a gente — dá uma olhada nas vagas abertas.

Ver vagas