Buyukweb
Prisma ORM ile Next.js ve Node.js: Schema, Migration ve Production Deploy Rehberi

Prisma ORM ile Next.js ve Node.js: Schema, Migration ve Production Deploy Rehberi

Prisma 5.x ile Next.js App Router entegrasyonu, schema-first model tanımlama, migration workflow (dev/deploy), CRUD ve transaction kullanımı, connection pool yönetimi ve Buyukweb VDS üzerinde PM2 ile self-host pratiği.

Büyükweb Editör EkibiHosting, Sunucu ve Sistem Yönetimi Editörü17 dakika okuma

Prisma ORM ile Next.js ve Node.js: Schema, Migration ve Production Deploy

Bu rehberi yazdığımız sırada elinizde okuduğunuz buyukweb.com blog sayfasının arkasında da Prisma çalışıyor — Next.js App Router + @prisma/client 5.22 + SQLite kombinasyonu. Yani aşağıdaki tavsiyeler kitap-bilgisi değil, kendi prodüksiyon stack'imizden çıkmış pratik notlar.

Prisma "tip-güvenli ORM" cümlesinin ötesinde aslında üç ayrı parça: schema-first bir DSL, migration motoru ve TypeScript ile otomatik tiplenmiş bir client. Üçü birlikte çalıştığında schema değişikliği → migration → kod tipi güncellemesi zinciri tek komut zinciriyle akıyor. Bu yazıda Prisma 5.x'i Buyukweb VDS (₺250/ay başlangıç E5 v4 VDS) üzerinde Node.js + Next.js ile production'a almanın somut adımlarını göreceksiniz: kurulum, schema yazma kuralları, migrate dev ile migrate deploy farkı, CRUD ve transaction örnekleri, connection pool ayarı ve PM2 ile deploy.

Buyukweb perspektifi: cPanel paylaşımlı hosting paketleri PHP/MySQL ağırlıklıdır; bazı cPanel sürümlerinde Node.js Selector eklentisi bulunur ama Node.js LTS sürümünü, port izinlerini ve sistem servislerini kendiniz seçmek istiyorsanız doğru seçenek VDS'tir. Üretim için /e5v4-vds paketinden başlayıp Node.js 20 LTS, PostgreSQL veya MariaDB ile kendi kurulumunuzu yapmak en sağlıklı yoldur.

Prisma Neden? Raw SQL ve Diğer ORM'lerle Kısa Karşılaştırma

ORM seçimi ekibe ve uygulamaya bağlı kararlar barındırır. Prisma'nın güçlü tarafı schema-first yaklaşım + otomatik üretilen TypeScript tipleri; zayıf tarafı raw SQL'in tüm esnekliğini her zaman karşılayamaması.

Yaklaşım Yazım Stili Type Safety Migration Öğrenme Eğrisi Tercih Senaryosu
Raw SQL (pg, mysql2) Düz string sorgu Manuel Yok / kendi araç Düşük Performans-kritik, küçük schema
Knex.js (query builder) Zincirli API Manuel/parça migrations Orta SQL'e yakın, esnek
Sequelize Class tabanlı Eksik (TS desteği zayıf) umzug Orta-yüksek Legacy Node.js
TypeORM Decorator + Active Record/Data Mapper İyi Otomatik Yüksek Enterprise, Java/.NET deneyimli ekip
Drizzle TypeScript şema + zincir API Çok iyi Hafif Düşük-orta Edge runtime, küçük bundle
Prisma 5.x Schema DSL + auto-generated client Çok iyi prisma migrate Düşük Modern Next.js/Node.js, schema-first

Prisma'nın "type-safe" iddiası şu somut şeydir: prisma.user.findMany({ where: { name: 'Ali' } }) yazdığınızda name alanı yoksa TypeScript derlemede patlar; include: { posts: true } dediğinizde dönen tipte posts: Post[] otomatik gelir. select ile alan filtreleyince dönen tip de daralır. Bu özellik IDE içinde ciddi hata önleyici.

Tercih etmeyin: Tek tablolu, 200 satırlık bir mikro hizmet için Prisma kurmayı. Schema-first iş akışı ve migration motoru oraya değer katmaz; raw mysql2 veya better-sqlite3 daha hızlı sonuç verir. Prisma, en az 4-5 model ve büyüyen bir schema olduğunda kazanmaya başlar.

Kurulum (Buyukweb VDS Senaryosu)

VDS'te Ubuntu 22.04 / 24.04 veya AlmaLinux 9 üzerinde Node.js 20 LTS önerilir. nvm ile sürüm yönetimi pratiktir.

# Buyukweb VDS — Node.js 20 LTS kurulumu
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
source ~/.bashrc
nvm install 20
nvm use 20
node -v   # v20.x.x

# Proje klasörü
mkdir uygulama && cd uygulama
npm init -y

# Prisma — dev araç + runtime client
npm install -D prisma
npm install @prisma/client

# PostgreSQL ile başlatma
npx prisma init --datasource-provider postgresql
# veya MySQL/MariaDB:
# npx prisma init --datasource-provider mysql
# veya SQLite (küçük ölçek):
# npx prisma init --datasource-provider sqlite

Komut iki dosya üretir: .env (içinde DATABASE_URL) ve prisma/schema.prisma (datasource + generator). DATABASE_URL değerini gerçek bağlantı bilgileriyle güncelleyin:

# PostgreSQL
DATABASE_URL="postgresql://kullanici:[email protected]:5432/uygulama_db?schema=public"

# MariaDB / MySQL
DATABASE_URL="mysql://kullanici:[email protected]:3306/uygulama_db"

# SQLite (Buyukweb blog stack'inin de kullandığı, küçük-orta ölçek için)
DATABASE_URL="file:./prisma/blog.db"

schema.prisma Yazımı: Model, Alan Tipleri, Relations

schema.prisma Prisma'nın kalbidir. datasource, generator ve model blokları içerir.

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

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

model User {
  id        Int       @id @default(autoincrement())
  email     String    @unique
  name      String?
  role      Role      @default(USER)
  posts     Post[]
  createdAt DateTime  @default(now())
  updatedAt DateTime  @updatedAt

  @@index([email])
}

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

  @@index([slug])
  @@index([authorId, published])
}

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

enum Role {
  USER
  EDITOR
  ADMIN
}

Alan tipleri pratik liste: Int, BigInt, String (@db.Text ile uzun), Boolean, DateTime, Float, Decimal (para için), Json (SQLite desteklemez), Bytes.

@default stratejileri: autoincrement() Int PK için tipik; uuid() ve cuid() collision-güvenli ID üretir; now() createdAt için; @updatedAt her update çağrısında otomatik.

Relations: 1-to-N Post.author User @relation(fields: [authorId], references: [id]), 1-to-1 @unique ile, implicit N-to-N Post.tags Tag[] + Tag.posts Post[] (Prisma ara tabloyu kendi yönetir). Ara tabloda ek alan gerekiyorsa explicit PostTag modeli yazılır. onDelete: Cascade parent silindiğinde ilişkiyi siler; üretimde Restrict "yanlışlıkla silme" riskine karşı daha güvenli.

Migration Workflow: dev / deploy / db push Farkı

Bu üç komut karıştırıldığında production'da veri kaybı yaşanır.

Komut Ne Yapar Ne Zaman
prisma migrate dev --name <isim> Yeni migration dosyası üretir, uygular, Prisma Client'ı yeniden oluşturur Geliştirme — schema değiştirdikten sonra
prisma migrate deploy Sadece pending migration'ları uygular; schema reset YOK Production deploy adımı
prisma db push Migration üretmeden DB schema'yı şema dosyasına eşler Prototipleme — migration history yok
prisma migrate reset TÜM DB'yi düşürür ve baştan migration'ları uygular DEV-ONLY — production'da ASLA
prisma migrate status Hangi migration'lar uygulanmış göstermek Deploy öncesi sağlık kontrolü
prisma migrate diff İki schema arasındaki farkı SQL olarak çıkarmak Drift kontrolü

Tipik Geliştirme Akışı

# 1) schema.prisma'yı düzenle (yeni model ekle vs.)
# 2) Migration üret + uygula
npx prisma migrate dev --name post_publishedAt_eklendi

# 3) Tip güncellenmiş Prisma Client otomatik regenerate olur
# (Manuel tetiklemek için): npx prisma generate

migrate dev her çağrıda prisma/migrations/<timestamp>_<isim>/migration.sql üretir; bu dosyaları git'e commit edin.

Production Deploy

# Buyukweb VDS — production sunucusunda
git pull
npm ci
npx prisma generate         # Client kodunu yenile
npx prisma migrate deploy   # Sadece pending migration'ları uygula
pm2 reload uygulama

Öneri: postinstall hook'una prisma generate koyun, build script'ine prisma generate && next build koyun (Buyukweb blog package.json'unda da bu pattern kullanılıyor).

{
  "scripts": {
    "build": "prisma generate && next build",
    "start": "next start",
    "postinstall": "prisma generate"
  }
}

Prisma Client: CRUD ve Filter Pratikleri

@prisma/client kullanımı için tipik pattern'ler.

import { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();

// findMany — pagination + ordering + select
const posts = await prisma.post.findMany({
  where: { published: true, title: { contains: 'next', mode: 'insensitive' } },
  orderBy: { publishedAt: 'desc' },
  take: 20,
  skip: 0,
  select: {
    id: true,
    slug: true,
    title: true,
    author: { select: { name: true } },
  },
});

// findUnique — tek kayıt, indeks/PK üzerinden
const post = await prisma.post.findUnique({
  where: { slug: 'prisma-orm-next-js' },
  include: { author: true, tags: true },
});

// create
await prisma.post.create({
  data: {
    slug: 'yeni-yazi',
    title: 'Yeni Yazı',
    author: { connect: { id: 1 } },
    tags: { connect: [{ id: 3 }, { id: 5 }] },
  },
});

// upsert — varsa güncelle, yoksa oluştur
await prisma.user.upsert({
  where: { email: '[email protected]' },
  update: { role: 'EDITOR' },
  create: { email: '[email protected]', role: 'EDITOR' },
});

// updateMany / deleteMany — toplu işlem
await prisma.post.updateMany({
  where: { author: { role: 'USER' } },
  data: { published: false },
});

// count
const yayinli = await prisma.post.count({ where: { published: true } });

Filter Operatörleri

equals, not, in, notIn, contains, startsWith, endsWith, gt, gte, lt, lte, AND, OR, NOT, mode: 'insensitive' (PostgreSQL).

const result = await prisma.post.findMany({
  where: {
    AND: [
      { published: true },
      { OR: [{ title: { contains: 'vds' } }, { content: { contains: 'vds' } }] },
      { createdAt: { gte: new Date('2026-01-01') } },
      { NOT: { author: { role: 'USER' } } },
    ],
  },
});

Transaction: Atomik İşlemler

İki yaklaşım vardır: array-tabanlı sequential ve interactive callback.

// Array — sıralı işlem; tümü başarılı olursa commit
await prisma.$transaction([
  prisma.account.update({ where: { id: 1 }, data: { balance: { decrement: 100 } } }),
  prisma.account.update({ where: { id: 2 }, data: { balance: { increment: 100 } } }),
  prisma.transferLog.create({ data: { fromId: 1, toId: 2, amount: 100 } }),
]);

// Interactive — koşullu mantık
await prisma.$transaction(async (tx) => {
  const stok = await tx.product.findUnique({ where: { id: 5 } });
  if (!stok || stok.quantity < 1) throw new Error('Stok yok');
  await tx.product.update({
    where: { id: 5 },
    data: { quantity: { decrement: 1 } },
  });
  await tx.order.create({ data: { productId: 5, userId: 7 } });
});

Interactive transaction içinde throw ederseniz tüm işlem rollback olur. Default maxWait: 2000ms, timeout: 5000ms; uzun işlemde prisma.$transaction(async (tx) => { ... }, { timeout: 15000 }) ile artırın.

Raw Queries: Ne Zaman ve Nasıl

Prisma yetmediğinde $queryRaw ve $executeRaw template literal SQL injection korumalı çalışır.

// SELECT — typed
const rows = await prisma.$queryRaw<Array<{ id: number; total: number }>>\`
  SELECT id, COUNT(*)::int AS total
  FROM "Post"
  WHERE "authorId" = ${userId}
  GROUP BY id
\`;

// INSERT/UPDATE/DELETE
const affected = await prisma.$executeRaw\`
  UPDATE "Post" SET "published" = true WHERE "authorId" = ${userId}
\`;

// Dinamik kolon adı gerekiyorsa — $queryRawUnsafe (DİKKAT: SQL injection riski)
const data = await prisma.$queryRawUnsafe(
  `SELECT * FROM "Post" ORDER BY "${guvenliKolon}" LIMIT 10`,
);

$queryRawUnsafe kullanırken parametreler mutlaka allow-list ile filtrelenmeli; aksi halde tek satırlık SQL injection açığı doğar.

Connection Pool ve Production Tuning

PrismaClient instance başına default 5-10 PostgreSQL bağlantısı açar. Pool boyutu DATABASE_URL içinde connection_limit parametresiyle ayarlanır:

DATABASE_URL="postgresql://kullanici:[email protected]:5432/uygulama_db?connection_limit=20&pool_timeout=10"

PostgreSQL max_connections ile orantılı düşünün. PM2 cluster mode ile 4 worker çalıştırıyorsanız her worker kendi PrismaClient'ını yaratır → 4 × 20 = 80 bağlantı. PostgreSQL max_connections=100'da yetersiz kalır; bu durumda PgBouncer transaction mode önerilir (detaylı kurulum için ID 185 PgBouncer rehberimize bakabilirsiniz).

// Query log debug
const prisma = new PrismaClient({
  log: ['query', 'error', 'warn'],
});

Tercih etmeyin: Her HTTP isteğinde new PrismaClient() çağırmayı. Connection leak ve "too many connections" hatası kaçınılmaz olur. Aşağıdaki singleton pattern Next.js HMR'ında bile bağlantıyı korur.

Next.js App Router Entegrasyonu

Next.js geliştirme sırasında HMR (Hot Module Replacement) modülü yeniden yükler; her yüklemede yeni PrismaClient oluşursa bağlantı sızar. Singleton pattern bunu önler:

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

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

export const prisma =
  globalForPrisma.prisma ??
  new PrismaClient({
    log: process.env.NODE_ENV === 'development' ? ['query', 'error'] : ['error'],
  });

if (process.env.NODE_ENV !== 'production') globalForPrisma.prisma = prisma;

Server Component (App Router)

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

export default async function BlogIndex() {
  const posts = await prisma.post.findMany({
    where: { published: true },
    orderBy: { publishedAt: 'desc' },
    take: 20,
    select: { id: true, slug: true, title: true },
  });
  return (
    <ul>
      {posts.map((p) => (
        <li key={p.id}><a href={`/blog/${p.slug}`}>{p.title}</a></li>
      ))}
    </ul>
  );
}

Server Action ile Mutation

// app/admin/post/actions.ts
'use server';
import { prisma } from '@/lib/prisma';
import { revalidatePath } from 'next/cache';

export async function publishPost(slug: string) {
  await prisma.post.update({
    where: { slug },
    data: { published: true, publishedAt: new Date() },
  });
  revalidatePath(`/blog/${slug}`);
}

Route Handler (REST API)

// app/api/posts/route.ts
import { prisma } from '@/lib/prisma';
import { NextResponse } from 'next/server';

export async function GET() {
  const posts = await prisma.post.findMany({
    where: { published: true },
    take: 50,
  });
  return NextResponse.json(posts);
}

Prisma 5.x @prisma/client Edge runtime'da doğrudan çalışmaz; Edge'de çalıştırmak için Prisma Accelerate gerekir. Buyukweb VDS senaryosunda Node.js runtime kullanılır — Edge gerekli değil.

Prisma Studio ve Seed

prisma studio lokal browse için 5555 portunda arayüz açar. Buyukweb VDS senaryosunda bu portu firewall'da kapalı tutun, lokalden SSH tunnel ile erişin:

# Lokal makineden SSH tunnel
ssh -L 5555:127.0.0.1:5555 kullanici@vds-ip-adresi

# VDS üzerinde
npx prisma studio   # 127.0.0.1:5555 dinler
# Tarayıcıda lokalden: http://localhost:5555

Seed Script

// prisma/seed.ts
import { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();

async function main() {
  await prisma.user.upsert({
    where: { email: '[email protected]' },
    update: {},
    create: { email: '[email protected]', name: 'Admin', role: 'ADMIN' },
  });
}

main()
  .catch((e) => { console.error(e); process.exit(1); })
  .finally(() => prisma.$disconnect());

package.json'a prisma bloğu ekleyin:

{
  "prisma": {
    "seed": "tsx prisma/seed.ts"
  }
}

npx prisma db seed ile çalıştırırsınız. Ekipçe tsx veya ts-node kullandığınıza göre script komutunu uyarlayın.

Performans İpuçları

  • select ile over-fetching önle. include: { posts: true } her postun tüm alanlarını çeker; gerekiyorsa include: { posts: { select: { id: true, title: true } } } deyin.
  • N+1 problemi: Listede her elemana ayrı sorgu atmak yerine include veya findMany + where: { id: { in: [...] } } ile batch çekin.
  • Pagination: take + skip küçük ölçekte tamam; büyük tablolarda cursor-based pagination (cursor: { id: lastId }) daha verimli.
  • Index: @@index([authorId, published]) gibi composite index'ler en sık WHERE kalıbına göre eklenmeli.
  • Query log: Yavaş sorgu varsa log: ['query'] ile süresini ölçün, sonra EXPLAIN ile DB tarafına bakın.

Tipik Hatalar ve Çözümleri

Hata Kodu Anlam Çözüm
P2002 Unique constraint çakışması upsert veya try/catch ile yakala
P2025 Kayıt bulunamadı (update/delete öncesi) findUnique ile null kontrol
P1001 DB sunucusuna erişilemedi DATABASE_URL, firewall, port
P1008 İşlem zaman aşımı pool_timeout artır veya pool boyutu büyüt
P2024 Connection pool timeout connection_limit artır, PgBouncer ekle
P3009 Migration drift / failed migration prisma migrate resolve --rolled-back <name>
import { Prisma } from '@prisma/client';

try {
  await prisma.user.create({ data: { email: '[email protected]' } });
} catch (e) {
  if (e instanceof Prisma.PrismaClientKnownRequestError && e.code === 'P2002') {
    return { error: 'Bu e-posta zaten kayıtlı.' };
  }
  throw e;
}

Buyukweb VDS Üzerinde PM2 ile Self-Host

Production deploy adımları (Ubuntu 22.04 / 24.04 — /e5v4-vds üzerinde):

# Node 20 + PM2
nvm install 20 && nvm use 20
npm install -g pm2

# PostgreSQL 15 (kendi DB'niz)
sudo apt install postgresql-15 -y
sudo -u postgres psql -c "CREATE USER uygulama_user WITH PASSWORD 'GUVENLI_SIFRE';"
sudo -u postgres psql -c "CREATE DATABASE uygulama_db OWNER uygulama_user;"

# Uygulama
git clone <repo-url> /var/www/uygulama
cd /var/www/uygulama
npm ci
cp .env.example .env.production   # DATABASE_URL'i düzenleyin
NODE_ENV=production npx prisma migrate deploy
NODE_ENV=production npm run build

# PM2 ile başlat
pm2 start npm --name uygulama -- start
pm2 save
pm2 startup systemd

PostgreSQL portu 5432 dış dünyaya açık olmamalı; listen_addresses = 'localhost' ve pg_hba.conf localhost-only kalsın. Uygulama aynı VDS'te çalıştığında bu varsayılan yeterli. Nginx proxy_pass http://127.0.0.1:3000 ile Next.js'i 80/443 portunda yayınlar; TLS için Let's Encrypt + certbot standart yol. PM2 cluster mode'da (pm2 start npm --name uygulama -i max -- start) her worker kendi PrismaClient'ını yaratır — toplam bağlantı = worker × connection_limit; PostgreSQL max_connections'ı buna göre planlayın.

Tercih etmeyin: Production veritabanını deploy'larda prisma db push ile güncellemeyi. Migration history oluşmaz ve schema drift kaçınılmaz olur. Production yolu daima migrate deploy.

Buyukweb Hosting Bağlantısı

Kullanım Önerilen Buyukweb Paket
Üretim Node.js + Prisma VDS Sunucu — root, port izinleri
NVMe IOPS isteyen DB E5 v4 VDS — PostgreSQL/MariaDB için ideal
PHP/MySQL ağırlıklı klasik site cPanel Web Hosting — Node.js çalıştırması için VDS önerilir
WordPress (Prisma'sız) WordPress Hosting
Ölçek büyürse Fiziksel Dedicated

Buyukweb VDS paketleri NVMe SSD + KVM sanallaştırma + L3/L4/L7 DDoS koruması + Veeam altyapısıyla günlük otomatik sunucu yedeklemesi içerir; Prisma uygulamanızın altyapı tarafı tamamen sizin kontrolünüzdedir.

Sıkça Sorulan Sorular

Prisma vs Sequelize hangisi?

Yeni bir TypeScript projesi başlatıyorsanız Prisma'nın schema-first yaklaşımı ve otomatik üretilen tipler iş akışını hızlandırır. Sequelize daha eski bir kütüphane, TypeScript desteği eklenmiş olsa da Prisma kadar tip-güvenli değil. Legacy bir Sequelize projesinin Prisma'ya taşınması ise schema'nın prisma db pull ile introspect edilip migration'ların elden geçirilmesini gerektirir; küçük projede 1-2 gün, büyükte 1-2 hafta.

migrate dev ile db push farkı nedir?

migrate dev her schema değişikliği için prisma/migrations/ altında SQL dosyası üretir; bu dosyalar git'e commit edilir, production'a migrate deploy ile uygulanır — yani versiyonlanmış değişiklik geçmişi olur. db push migration üretmeden direkt schema'yı DB'ye dayatır; prototipleme için pratiktir ama production'da kullanılmamalıdır çünkü hangi değişiklik ne zaman yapıldı bilgisi kaybolur.

Next.js'te Prisma singleton şart mı?

Production build'de Next.js modülü tek kez yükler, tek instance yeterli olur. Geliştirme sırasında HMR her dosya değişikliğinde modülü yeniden yükler ve singleton olmazsa her seferinde yeni PrismaClient doğar — kısa sürede "too many connections" hatası alırsınız. Yani dev için şart, production için iyi pratik.

Connection pool ne işe yarar?

Her sorgu için yeni TCP/PostgreSQL bağlantısı açıp kapatmak yerine, hazır bir bağlantı havuzu tutar; gelen istek havuzdan müsait olanı alır, biter bırakır. Pool olmadan PostgreSQL'in max_connections sınırına çabuk dayanırsınız. Prisma default pool 5-10 bağlantıdır; connection_limit URL parametresiyle artırılır.

Prisma Edge runtime'da çalışır mı?

Standart @prisma/client Node.js runtime gerektirir; Edge çalıştırmaz. Edge'de Prisma kullanmanın yolu Prisma Accelerate (HTTP-tabanlı bağlantı yönetimi) servisidir. Buyukweb VDS senaryosunda Node.js runtime kullandığınız için Edge sınırlaması sizi etkilemez.

Schema değişikliğinde mevcut data nasıl korunur?

migrate dev üretilen migration.sql dosyasını git'e commit etmeden önce gözle inceleyin: DROP COLUMN veya rename gibi yıkıcı bir adım varsa veri kaybı olabilir. Kolon yeniden adlandırması Prisma için iki adım sorunu olur (drop + add); önce @map("eski_isim") ile mapping tanıtıp sonra fiziksel rename'i ayrı migration'da yapın. Production migration öncesi mutlaka DB yedeği alın (ID 176 yedekleme rehberimizde detayı var).

PostgreSQL mi MySQL mi MariaDB mi Prisma için?

Prisma üçünü de provider seviyesinde tam destekler; seçim ekibinize ve gereksinimlerinize bağlı. PostgreSQL'in jsonb ve gelişmiş tip sistemi modern uygulamalar için artıdır; MariaDB cPanel hosting'te varsayılan olduğundan bu tarafa yakınsanız sürtünmesizdir. Buyukweb VDS'te ikisinden birini kendiniz kurarsınız.

SQLite production'da kullanılır mı?

Tek sunucu, düşük yazma yoğunluğu ve okuma-ağırlıklı uygulamalarda kullanılır — Buyukweb blog'u (bu yazıyı okuduğunuz site) SQLite kullanır ve memnunuz. Ama yüksek concurrent yazma gerekiyorsa veya birden fazla uygulama sunucusu DB'ye eşzamanlı yazıyorsa PostgreSQL/MariaDB tercih edin.

Prisma generate ne zaman tetiklenir?

prisma migrate dev otomatik tetikler. schema.prisma değiştirip migration üretmediğinizde manuel npx prisma generate çalıştırın. CI/CD pipeline'da postinstall hook ile veya build script'inin başında prisma generate koymak güvenlidir — Buyukweb blog package.json'unda da aynı pattern kullanılıyor.

"Connection pool timeout (P2024)" hatası ne demek?

Pool dolu, müsait bağlantı yok ve pool_timeout saniyesi içinde de boşalmadı. İki neden tipik: (a) uzun sorgu pool'u tıkıyor — yavaş sorguları optimize edin, (b) pool boyutu yetersiz — connection_limit artırın veya PgBouncer ekleyin. PM2 cluster ile çalışıyorsanız worker × connection_limit toplamı PostgreSQL max_connections'tan büyükse PgBouncer kaçınılmaz olur.

Sonuç

Prisma, modern TypeScript-Node.js uygulamalarında schema-first iş akışını ve tip-güvenli sorgu API'sini birleştirir. Doğru kullanıldığında bir hafta içinde geliştirme + migration + deploy zincirinin tamamı oturur; yanlış kullanıldığında db push'la production'a girip schema drift sorunlarıyla uğraşırsınız. Bu yazıdaki üç altın kural: production'da daima migrate deploy, Next.js dev'de Prisma singleton, ve connection pool'u uygulama yükünüze göre ayarlayın.

Buyukweb VDS (₺250/ay başlangıç) Node.js + Prisma + PostgreSQL stack'i için root yetkisi, NVMe SSD ve günlük Veeam yedeklemesi sunar. /e5v4-vds paketinden başlayıp PM2 ile self-host yapmak — bu yazının baştan sona pratiklediği yol.

Teknik destek için: 0850 302 60 70 veya iletişim sayfamız.


İlgili Büyükweb Hizmetleri

Node.js + Prisma stack'ini Türkiye lokasyonlu sunucularda çalıştırmak için:

Sorularınız için 0850 302 60 70 numaralı destek hattımıza veya iletişim sayfamıza yazabilirsiniz.

Veritabanı Yönetimi İlgili Hizmetlerimiz

Bu yazıda anlatılan teknik konuyu profesyonel altyapıyla deneyimleyin

Etiketler:

#node.js#prisma#veritabanı#database#veri yönetimi

Bu yazıyı paylaş