Next.js 15 Full-Stack Uygulama Geliştirme

Ders 1/3 40 dakika

Prisma ORM ile Veritabanı Yönetimi

Prisma kurulumu, schema tanımlama, CRUD işlemleri ve ilişkisel veri modelleme. PostgreSQL ile gerçek veritabanı entegrasyonu.

Prisma Nedir?

Prisma, TypeScript için yazılmış modern bir ORM (Object-Relational Mapper)\'dir. Tip güvenli veritabanı sorgular, otomatik migration ve sezgisel API sunar.

Kurulum

npm install prisma @prisma/client
npx prisma init --datasource-provider postgresql

Schema Tanımlama

// prisma/schema.prisma
generator client {
  provider = "prisma-client-js"
}

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

model Kullanici {
  id        Int       @id @default(autoincrement())
  email     String    @unique
  isim      String
  rol       Rol       @default(KULLANICI)
  yazilar   Yazi[]
  olusturma DateTime  @default(now())

  @@map("kullanicilar")
}

model Yazi {
  id          Int       @id @default(autoincrement())
  baslik      String
  icerik      String
  yayinda     Boolean   @default(false)
  yazar       Kullanici @relation(fields: [yazarId], references: [id])
  yazarId     Int
  etiketler   Etiket[]
  olusturma   DateTime  @default(now())
  guncelleme  DateTime  @updatedAt

  @@map("yazilar")
}

model Etiket {
  id     Int    @id @default(autoincrement())
  isim   String @unique
  yazilar Yazi[]

  @@map("etiketler")
}

enum Rol {
  ADMIN
  KULLANICI
}

Migration Çalıştırma

npx prisma migrate dev --name ilk-tablo
npx prisma studio  # Görsel veritabanı editörü

Prisma Client (Singleton Pattern)

// lib/prisma.ts
import { PrismaClient } from "@prisma/client";

const globalForPrisma = globalThis as unknown as {
  prisma: PrismaClient | undefined;
};

export const prisma =
  globalForPrisma.prisma ??
  new PrismaClient({
    log: ["query", "error", "warn"],
  });

if (process.env.NODE_ENV !== "production") {
  globalForPrisma.prisma = prisma;
}

CRUD İşlemleri

import { prisma } from "@/lib/prisma";

// CREATE
const yeniKullanici = await prisma.kullanici.create({
  data: { email: "[email protected]", isim: "Ali Veli" },
});

// READ (tek)
const kullanici = await prisma.kullanici.findUnique({
  where: { id: 1 },
  include: { yazilar: true }, // İlişkili verileri getir
});

// READ (liste)
const yazilar = await prisma.yazi.findMany({
  where: { yayinda: true },
  orderBy: { olusturma: "desc" },
  take: 10,
  skip: (sayfa - 1) * 10,
  include: { yazar: { select: { isim: true } } },
});

// UPDATE
const guncellenmis = await prisma.kullanici.update({
  where: { id: 1 },
  data: { isim: "Ali Güncellendi" },
});

// DELETE
await prisma.kullanici.delete({ where: { id: 1 } });

// COUNT
const toplam = await prisma.yazi.count({ where: { yayinda: true } });

Server Component\'ta Kullanım

// app/blog/page.tsx
import { prisma } from "@/lib/prisma";

export default async function BlogListesi() {
  const yazilar = await prisma.yazi.findMany({
    where: { yayinda: true },
    orderBy: { olusturma: "desc" },
    include: { yazar: { select: { isim: true } } },
  });

  return (
    <div>
      {yazilar.map(yazi => (
        <article key={yazi.id}>
          <h2>{yazi.baslik}</h2>
          <p>{yazi.yazar.isim}</p>
        </article>
      ))}
    </div>
  );
}

Önemli Noktalar

  • Prisma, TypeScript için tip güvenli modern ORM'dir
  • schema.prisma dosyasında veri modelleri tanımlanır
  • prisma migrate dev ile veritabanı şeması güncellenir
  • Singleton pattern ile PrismaClient hot-reload sorununu önler