logo
eng-flag

Prisma Notları ve İpuçları

İçindekiler

  1. Kurulum
  2. Şema Tanımı
  3. Veri Türleri
  4. Model İlişkileri
  5. Model İlişkileri Örneği
  6. Prisma Client
  7. CRUD Operasyonları
  8. Filtreleme ve Sıralama
  9. İşlemler
  10. Göçler
  11. Veri Tohumu

Kurulum

Prisma CLI'yi kurun:

npm install prisma --save-dev

Projede Prisma'yı başlatın:

npx prisma init

Şema Tanımı

Veri modelinizi schema.prisma dosyasında tanımlayın:

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

generator client {
  provider = "prisma-client-js"
}

model User {
  id        Int      @id @default(autoincrement())
  email     String   @unique
  name      String?
  posts     Post[]
  profile   Profile?
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
}

model Post {
  id        Int      @id @default(autoincrement())
  title     String
  content   String?
  published Boolean  @default(false)
  author    User     @relation(fields: [authorId], references: [id])
  authorId  Int
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
}

model Profile {
  id     Int     @id @default(autoincrement())
  bio    String?
  user   User    @relation(fields: [userId], references: [id])
  userId Int     @unique
}

Veri Türleri

  • String: Metin değerleri
  • Int: Tam sayılar
  • Float: Kesirli sayılar
  • Boolean: Doğru/yanlış değerler
  • DateTime: Tarih ve saat değerleri
  • Json: JSON verileri
  • Bytes: İkili veriler

Model İlişkileri

  • Bir-Bir: @relation ile @unique alanı
  • Bir-Çok: "çok" tarafında @relation
  • Çok-Çok: Dolaylı ilişki tablosu veya açık bir model üzerinden

Çok-Çok ilişkisi örneği:

model Category {
  id    Int    @id @default(autoincrement())
  name  String
  posts Post[]
}

model Post {
  id         Int        @id @default(autoincrement())
  title      String
  categories Category[]
}

Model İlişkileri Örneği

Prisma'daki çeşitli ilişki türlerini göstermek için gerçek bir senaryoyu inceleyelim. Basit bir e-ticaret sistemi modelleyeceğiz: kullanıcılar, siparişler, ürünler ve kategoriler.

Senaryo Genel Bakış

Aşağıdaki varlıklar olacak:

  • Sipariş verebilen kullanıcılar
  • Birden fazla ürün içeren siparişler
  • Kategorilere ait ürünler
  • Alt kategorileri olabilen kategoriler

Şema Tanımı

model User {
  id        Int      @id @default(autoincrement())
  email     String   @unique
  name      String
  orders    Order[]
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
}

model Order {
  id           Int           @id @default(autoincrement())
  user         User          @relation(fields: [userId], references: [id])
  userId       Int
  orderItems   OrderItem[]
  totalAmount  Decimal
  status       OrderStatus
  createdAt    DateTime      @default(now())
  updatedAt    DateTime      @updatedAt
}

model OrderItem {
  id        Int      @id @default(autoincrement())
  order     Order    @relation(fields: [orderId], references: [id])
  orderId   Int
  product   Product  @relation(fields: [productId], references: [id])
  productId Int
  quantity  Int
  price     Decimal
}

model Product {
  id          Int         @id @default(autoincrement())
  name        String
  description String?
  price       Decimal
  stock       Int
  category    Category    @relation(fields: [categoryId], references: [id])
  categoryId  Int
  orderItems  OrderItem[]
  createdAt   DateTime    @default(now())
  updatedAt   DateTime    @updatedAt
}

model Category {
  id            Int        @id @default(autoincrement())
  name          String
  products      Product[]
  parentCategory Category?  @relation("SubCategories", fields: [parentId], references: [id])
  parentId       Int?
  subcategories  Category[] @relation("SubCategories")
}

enum OrderStatus {
  PENDING
  PROCESSING
  SHIPPED
  DELIVERED
  CANCELLED
}

İlişki Türleri Açıklaması

  1. Bir-Çok İlişki:

    • Kullanıcı ile Sipariş: Bir kullanıcı birden fazla siparişe sahip olabilir, ancak her sipariş yalnızca bir kullanıcıya aittir.
    • Sipariş ile Sipariş Öğesi: Bir sipariş birden fazla sipariş öğesine sahip olabilir, ancak her sipariş öğesi yalnızca bir siparişe aittir.
    • Kategori ile Ürün: Bir kategori birden fazla ürüne sahip olabilir, ancak her ürün yalnızca bir kategoriye aittir.
  2. Çok-Çok İlişki:

    • Ürün ile Sipariş: Bir ürün birden fazla siparişte olabilir ve bir sipariş birden fazla ürün içerebilir. Bu, OrderItem modeli üzerinden uygulanır ve bu model köprü tablosu olarak hizmet eder.
  3. Kendi Kendine İlişki:

    • Kategori ile Kategori: Bir kategori birden fazla alt kategoriye sahip olabilir ve her alt kategori bir ana kategoriye aittir. Bu, kendi kendine ilişki kullanılarak uygulanır.
  4. Bir-Bir İlişki:

    • Bu şemada açıkça gösterilmemiştir, ancak örneğin, bir UserProfile modeli ekleyerek bir-bir ilişkisi oluşturulabilir:
    model UserProfile {
      id     Int    @id @default(autoincrement())
      bio    String?
      user   User   @relation(fields: [userId], references: [id])
      userId Int    @unique
    }
    
    model User {
      id      Int          @id @default(autoincrement())
      email   String       @unique
      name    String
      profile UserProfile?
      // ... diğer alanlar
    }
    

İlişkileri Sorgularda Kullanma

Bu ilişkileri kullanan bazı örnek sorgular:

  1. Siparişleriyle birlikte bir kullanıcıyı alın:
const userWithOrders = await prisma.user.findUnique({
  where: { id: 1 },
  include: { orders: true }
})
  1. Sipariş ve sipariş öğeleri ile ürünleri alın:
const orderWithItems = await prisma.order.findUnique({
  where: { id: 1 },
  include: {
    orderItems: {
      include: { product: true }
    }
  }
})
  1. Kategoriyi alt kategorileri ve ürünleri ile birlikte alın:
const categoryWithSubcategories = await prisma.category.findUnique({
  where: { id: 1 },
  include: {
    subcategories: true,
    products: true
  }
})

Prisma Client

Prisma Client'ı oluşturun:

npx prisma generate

Kodunuzda Prisma Client'ı kullanın:

import { PrismaClient } from '@prisma/client'

const prisma = new PrismaClient()

CRUD Operasyonları

Oluşturma

const newUser = await prisma.user.create({
  data: {
    email: 'john@example.com',
    name: 'John Doe',
    posts: {
      create: {
        title: 'My first post',
        content: 'This is the content of my first post',
      },
    },
  },
  include: {
    posts: true,
  },
})

Okuma

// Tek bir kullanıcıyı al
const user = await prisma.user.findUnique({
  where: { id: 1 },
})

// Kullanıcılarla birlikte gönderileri alın
const usersWithPosts = await prisma.user.findMany({
  include: { posts: true }
})

Güncelleme

const updatedUser = await prisma.user.update({
  where: { id: 1 },
  data: {
    name: 'John Smith',
  },
})

Silme

const deletedUser = await prisma.user.delete({
  where: { id: 1 },
})

Filtreleme ve Sıralama

Filtreleme

const filteredUsers = await prisma.user.findMany({
  where: {
    email: {
      contains: '@example.com'
    },
    createdAt: {
      gt: new Date('2024-01-01')
    }
  }
})

Sıralama

const sortedPosts = await prisma.post.findMany({
  orderBy: {
    createdAt: 'desc'
  }
})

İşlemler

Veri Göçleri

Veri göçlerini oluşturun:

npx prisma migrate dev --name <migration-name>

Göçleri uygulayın:

npx prisma migrate deploy

Veri Tozumu

Veri tozumu oluşturun:

npx prisma db seed

2024 © Tüm hakları saklıdır - buraxta.com