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