Prisma ve PostgreSQL ile NestJS, 2026'da mevcut en üretken backend stack'lerinden biridir. NestJS yapı ve bağımlılık enjeksiyonu sağlar, Prisma tip güvenliğiyle veritabanı erişimini yönetir ve PostgreSQL savaşta test edilmiş ilişkisel bir veritabanı sunar. İşte bu stack ile eksiksiz bir REST API nasıl oluşturulur.
Proje Kurulumu
Yeni bir NestJS projesi oluşturun ve Prisma'yı yükleyin:
npm i -g @nestjs/cli
nest new my-api
cd my-api
npm install prisma @prisma/client
npx prisma init
Bu işlem bir prisma/schema.prisma dosyası ve yer tutucu DATABASE_URL içeren bir .env oluşturur.
Veritabanı Bağlantısını Yapılandırın
.env'yi PostgreSQL bağlantı dizinizle güncelleyin:
DATABASE_URL="postgresql://postgres:password@localhost:5432/myapi_db"
PostgreSQL kurulu değilse en hızlı yol Docker'dır:
docker run --name my-postgres -e POSTGRES_PASSWORD=password -e POSTGRES_DB=myapi_db -p 5432:5432 -d postgres:16
Şemanızı Tanımlayın
prisma/schema.prisma'yı açın ve modellerinizi tanımlayın. Basit bir görev yönetimi API'si oluşturalım:
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
model User {
id String @id @default(cuid())
email String @unique
name String
tasks Task[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model Task {
id String @id @default(cuid())
title String
description String?
priority Priority @default(MEDIUM)
status TaskStatus @default(TODO)
dueDate DateTime?
userId String
user User @relation(fields: [userId], references: [id])
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
enum Priority {
LOW
MEDIUM
HIGH
}
enum TaskStatus {
TODO
IN_PROGRESS
DONE
}
Tabloları oluşturmak için migration'ı çalıştırın:
npx prisma migrate dev --name init
Prisma Service Oluşturun
Uygulamanızın geri kalanının enjekte ettiği paylaşımlı bir Prisma servisi oluşturun:
// src/prisma/prisma.service.ts
import { Injectable, OnModuleInit } from '@nestjs/common';
import { PrismaClient } from '@prisma/client';
@Injectable()
export class PrismaService extends PrismaClient implements OnModuleInit {
async onModuleInit() {
await this.$connect();
}
}
// src/prisma/prisma.module.ts
import { Global, Module } from '@nestjs/common';
import { PrismaService } from './prisma.service';
@Global()
@Module({
providers: [PrismaService],
exports: [PrismaService],
})
export class PrismaModule {}
Tasks Modülünü Oluşturun
// src/tasks/tasks.service.ts
import { Injectable, NotFoundException } from '@nestjs/common';
import { PrismaService } from '../prisma/prisma.service';
import { CreateTaskDto } from './dto/create-task.dto';
@Injectable()
export class TasksService {
constructor(private prisma: PrismaService) {}
async findAll(userId: string) {
return this.prisma.task.findMany({
where: { userId },
orderBy: { createdAt: 'desc' },
});
}
async findOne(id: string, userId: string) {
const task = await this.prisma.task.findFirst({
where: { id, userId },
});
if (!task) throw new NotFoundException('Task not found');
return task;
}
async create(userId: string, dto: CreateTaskDto) {
return this.prisma.task.create({
data: { ...dto, userId },
});
}
async update(id: string, userId: string, dto: Partial<CreateTaskDto>) {
await this.findOne(id, userId); // bulunamazsa hata fırlatır
return this.prisma.task.update({
where: { id },
data: dto,
});
}
async remove(id: string, userId: string) {
await this.findOne(id, userId);
return this.prisma.task.delete({ where: { id } });
}
}
DTO'larla Doğrulama
Doğrulama paketlerini yükleyin ve class-validator dekoratörlerini kullanın:
npm install class-validator class-transformer
// src/tasks/dto/create-task.dto.ts
import { IsString, IsOptional, IsEnum, IsDateString } from 'class-validator';
import { Priority, TaskStatus } from '@prisma/client';
export class CreateTaskDto {
@IsString()
title: string;
@IsString()
@IsOptional()
description?: string;
@IsEnum(Priority)
@IsOptional()
priority?: Priority;
@IsDateString()
@IsOptional()
dueDate?: string;
}
main.ts'te doğrulamayı global olarak etkinleştirin:
app.useGlobalPipes(new ValidationPipe({ whitelist: true, transform: true }));
Endpoint'lerinizi Test Edin
Çalıştıktan sonra (npm run start:dev) API'niz http://localhost:3000 adresinde kullanılabilir:
POST /tasks → Görev oluştur
GET /tasks → Tüm görevleri listele
GET /tasks/:id → Bir görevi getir
PATCH /tasks/:id → Görevi güncelle
DELETE /tasks/:id → Görevi sil
PromptForge ile Kurulumu Atlayın
Bu eğitim, NestJS + Prisma + PostgreSQL kurulumunun temellerini ele aldı. Üretime hazır bir uygulama ayrıca kimlik doğrulama, hız sınırlama, hata yönetimi, Swagger dokümantasyonu, Docker yapılandırması ve CI/CD gerektirir. Bunların tümünü sıfırdan kurmak 1–2 gün sürer.
PromptForge tümünü üretir — şema, service'ler, controller'lar, kimlik doğrulama modülü, Dockerfile ve dokümantasyon — tek bir prompttan beş dakika içinde. Ücretsiz deneyin.