Prisma ORM - Setup e Modelos
Prisma é o ORM mais moderno para Node.js e TypeScript. Nesta aula, vamos configurá-lo e criar nossos modelos de dados.
Instalação
bash
npm install prisma --save-devnpm install @prisma/client # Inicializar Prismanpx prisma initIsso cria:
prisma/schema.prisma- Definição dos modelos.env- Variáveis de ambiente
Configurando a Conexão
env
# .envDATABASE_URL="postgresql://ecommerce:secret123@localhost:5432/ecommerce_db"prisma
// prisma/schema.prismagenerator client { provider = "prisma-client-js"} datasource db { provider = "postgresql" url = env("DATABASE_URL")}Definindo Modelos
prisma
// prisma/schema.prisma model User { id String @id @default(uuid()) email String @unique name String password String role Role @default(USER) createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") // Relacionamentos orders Order[] reviews Review[] cart CartItem[] addresses Address[] @@map("users")} enum Role { USER ADMIN} model Category { id String @id @default(uuid()) name String slug String @unique description String? image String? parentId String? @map("parent_id") parent Category? @relation("CategoryHierarchy", fields: [parentId], references: [id]) children Category[] @relation("CategoryHierarchy") products Product[] createdAt DateTime @default(now()) @map("created_at") @@map("categories")} model Product { id String @id @default(uuid()) name String slug String @unique description String? price Decimal @db.Decimal(10, 2) stock Int @default(0) images String[] active Boolean @default(true) categoryId String @map("category_id") category Category @relation(fields: [categoryId], references: [id]) createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") // Relacionamentos orderItems OrderItem[] cartItems CartItem[] reviews Review[] @@map("products")} model Order { id String @id @default(uuid()) userId String @map("user_id") user User @relation(fields: [userId], references: [id]) status OrderStatus @default(PENDING) total Decimal @db.Decimal(10, 2) addressId String @map("address_id") address Address @relation(fields: [addressId], references: [id]) items OrderItem[] createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") @@map("orders")} enum OrderStatus { PENDING PAID PROCESSING SHIPPED DELIVERED CANCELLED} model OrderItem { id String @id @default(uuid()) orderId String @map("order_id") order Order @relation(fields: [orderId], references: [id], onDelete: Cascade) productId String @map("product_id") product Product @relation(fields: [productId], references: [id]) quantity Int price Decimal @db.Decimal(10, 2) @@map("order_items")} model CartItem { id String @id @default(uuid()) userId String @map("user_id") user User @relation(fields: [userId], references: [id], onDelete: Cascade) productId String @map("product_id") product Product @relation(fields: [productId], references: [id]) quantity Int @default(1) createdAt DateTime @default(now()) @map("created_at") @@unique([userId, productId]) @@map("cart_items")} model Address { id String @id @default(uuid()) userId String @map("user_id") user User @relation(fields: [userId], references: [id], onDelete: Cascade) name String street String number String complement String? city String state String zipCode String @map("zip_code") country String @default("BR") isDefault Boolean @default(false) @map("is_default") orders Order[] @@map("addresses")} model Review { id String @id @default(uuid()) userId String @map("user_id") user User @relation(fields: [userId], references: [id], onDelete: Cascade) productId String @map("product_id") product Product @relation(fields: [productId], references: [id], onDelete: Cascade) rating Int comment String? createdAt DateTime @default(now()) @map("created_at") @@unique([userId, productId]) @@map("reviews")}Migrações
bash
# Criar e aplicar migraçãonpx prisma migrate dev --name init # Ver status das migraçõesnpx prisma migrate status # Aplicar em produçãonpx prisma migrate deployGerando o Cliente
bash
# Gerar cliente TypeScriptnpx prisma generateConfigurando o Cliente
typescript
// src/lib/prisma.tsimport { PrismaClient } from '@prisma/client'; const globalForPrisma = globalThis as unknown as { prisma: PrismaClient | undefined;}; export const prisma = globalForPrisma.prisma ?? new PrismaClient({ log: process.env.NODE_ENV === 'development' ? ['query', 'error', 'warn'] : ['error'],}); if (process.env.NODE_ENV !== 'production') { globalForPrisma.prisma = prisma;}Prisma Studio
Interface visual para explorar dados:
bash
npx prisma studioAbre em http://localhost:5555
Resumo
- ✅ Instalação e configuração do Prisma
- ✅ Schema completo para e-commerce
- ✅ Relacionamentos 1:1, 1:N, N:N
- ✅ Migrações de banco de dados
- ✅ Prisma Client tipado
Próxima aula: CRUD Completo com Prisma! 📝