Opções de Banco
| Opção | Indicado para | Custo |
|---|
| Neon | Produção + Preview branches | Free tier generoso |
| Supabase | Produção + realtime | Free tier |
| PostgreSQL local | Desenvolvimento | Gratuito |
| PostgreSQL no VPS | Self-hosted + baixo custo | Está no VPS |
O Neon é o banco recomendado porque suporta branches de banco de dados — você pode ter uma branch preview para testes e main para produção, análogo ao Git.
- Crie uma conta em neon.tech
- Crie um novo projeto
- Copie as duas strings de conexão:
- Pooled →
DATABASE_URL
- Direct →
DATABASE_URL_UNPOOLED
DATABASE_URL="postgresql://user:pass@ep-xxx-yyy.us-east-1.aws.neon.tech/neondb?sslmode=require"
DATABASE_URL_UNPOOLED="postgresql://user:pass@ep-xxx-yyy.us-east-1.aws.neon.tech/neondb?sslmode=require"
Comandos Prisma
| Comando | Descrição |
|---|
pnpm prisma migrate dev | Cria e aplica migration em desenvolvimento |
pnpm prisma migrate deploy | Aplica migrations pendentes em produção |
pnpm prisma migrate reset | Reseta o banco e re-aplica tudo (apenas dev) |
pnpm prisma db seed | Popula com dados iniciais |
pnpm prisma studio | UI visual para o banco |
pnpm prisma generate | Regenera o Prisma Client |
pnpm prisma db push | Sincroniza schema sem criar migrations |
Schema Principal
O schema está em prisma/schema.prisma. Os modelos principais são:
model Organization { ... } // Multi-tenant
model User { ... } // Autenticação + roles
model Teacher { ... } // Perfil de professores
model Student { ... } // Perfil de alunos
model Candidate { ... } // Perfil de candidatos
model Form { ... } // Testes/Formulários
model Question { ... } // Questões do teste
model Option { ... } // Opções de múltipla escolha
model Submission { ... } // Respostas e resultados
model TestAssignment { ... } // Aplicação de teste (token único)
Backup do Banco
Backup via pg_dump (VPS)
pg_dump $DATABASE_URL > backup_$(date +%Y%m%d).sql
Acesse Admin → Gerenciamento de Dados → Gerar Backup para exportar um JSON completo via API da plataforma.
Soft Delete
Modelos que suportam soft delete têm o campo deletedAt: DateTime?. Registros excluídos não são removidos do banco — apenas marcados com a data de exclusão e filtrados automaticamente nas queries.