blog
Banco de Dados

Prisma em 10 minutos: o ORM favorito dos vibecoders

Setup, schema, queries e migrations. Tudo que você precisa para começar com Prisma.

hidden: true

Prisma em 10 minutos

Prisma é um ORM que facilita trabalhar com banco de dados. Em vez de SQL, você escreve queries em TypeScript com autocomplete.

Setup

npm install prisma @prisma/client
npx prisma init

Isso cria:

  • prisma/schema.prisma — definição do banco
  • .env — URL de conexão

Schema

// prisma/schema.prisma
generator client {
  provider = "prisma-client-js"
}
 
datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}
 
model User {
  id        String   @id @default(cuid())
  name      String
  email     String   @unique
  posts     Post[]
  createdAt DateTime @default(now())
}
 
model Post {
  id        String   @id @default(cuid())
  title     String
  content   String?
  published Boolean  @default(false)
  author    User     @relation(fields: [authorId], references: [id])
  authorId  String
  createdAt DateTime @default(now())
}

Migrations

# Criar migration (development)
npx prisma migrate dev --name init
 
# Aplicar em produção
npx prisma migrate deploy

Queries

import { PrismaClient } from "@prisma/client";
const prisma = new PrismaClient();
 
// Criar
const user = await prisma.user.create({
  data: { name: "Jean", email: "[email protected]" },
});
 
// Listar
const users = await prisma.user.findMany();
 
// Buscar um
const user = await prisma.user.findUnique({
  where: { email: "[email protected]" },
});
 
// Com relações
const userWithPosts = await prisma.user.findUnique({
  where: { id: "abc123" },
  include: { posts: true },
});
 
// Atualizar
await prisma.user.update({
  where: { id: "abc123" },
  data: { name: "Jean Ortega" },
});
 
// Deletar
await prisma.user.delete({
  where: { id: "abc123" },
});
 
// Filtrar
const publishedPosts = await prisma.post.findMany({
  where: { published: true },
  orderBy: { createdAt: "desc" },
  take: 10,
});

Singleton (Next.js)

Em desenvolvimento, o Next.js faz hot reload e cria múltiplas instâncias do Prisma. Use um singleton:

// lib/db.ts
import { PrismaClient } from "@prisma/client";
 
const globalForPrisma = globalThis as unknown as {
  prisma: PrismaClient | undefined;
};
 
export const prisma = globalForPrisma.prisma ?? new PrismaClient();
 
if (process.env.NODE_ENV !== "production") {
  globalForPrisma.prisma = prisma;
}

Deploy na Veloz

# Variável de ambiente
veloz env set DATABASE_URL="postgres://..."
 
# Rodar migration
npx prisma migrate deploy
 
# Deploy do app
veloz deploy

Prisma Studio

Visualize e edite dados pelo browser:

npx prisma studio

Abre em localhost:5555 com uma interface visual para explorar o banco.