Pular para o conteúdoPedro Farbo
Lição 9 / 2550 min

Prisma ORM - Setup e Modelos

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 init

Isso 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 deploy

Gerando o Cliente

bash
# Gerar cliente TypeScriptnpx prisma generate

Configurando 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 studio

Abre 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! 📝

Gostou do conteúdo? Sua contribuição ajuda a manter tudo online e gratuito!

PIX:0737160d-e98f-4a65-8392-5dba70e7ff3e