İçeriğe geç
Teknik YazıDatabase

Mimio: Prisma'dan Drizzle'a Geçiş Notları

Serverless yapıda Prisma ile büyüyen ilk açılış maliyetini, Neon ve Drizzle ile daha hafif hale getirirken fark ettiğim pratik artılar.

22 Mart 20267 dk okuma

Mimio’nun ilk günlerinde Prisma kullanıyordum. Geliştirici tarafı rahattı, şema düzenliydi ve ilk aşamada karar vermeyi kolaylaştırıyordu. Ama proje serverless düzende büyüdükçe build süresi ve ilk açılış bekleme süresi göze batmaya başladı.

Kullanıcı bunu milisaniye olarak ölçmüyor olabilir ama ilk tıklamada hissediyor. Drizzle ve Neon’a geçiş benim için teknoloji değiştirmekten çok, sistemi biraz daha hafifletme kararıydı.

Prisma Neden Ağırlaşabiliyor?

Prisma güçlü bir araç ama serverless tarafta kendi yükünü de getiriyor. Başlangıç maliyeti, bağlantı davranışı ve çalışma şekli birleşince ilk isteğin süresi uzayabiliyor. Özellikle panel gibi ilk etkileşimin önemli olduğu yerlerde bu fark daha net hissediliyor.

Kurulum ve Şema Tarafı

bash
npm install drizzle-orm @neondatabase/serverless
npm install -D drizzle-kit
ts
export const clients = pgTable('clients', {
  id: uuid('id').primaryKey().defaultRandom(),
  name: text('name').notNull(),
  ageGroup: text('age_group', { enum: ['pediatric', 'adult'] }).notNull(),
  primaryGoal: text('primary_goal').notNull(),
  createdAt: timestamp('created_at').defaultNow().notNull(),
  createdBy: uuid('created_by').notNull(),
})

Bilgi

`$inferSelect` ve `$inferInsert` kullanımı, şema ile tiplerin aynı yerden gelmesini sağlıyor. Küçük gibi görünen bu şey, proje büyüyünce bayağı rahatlatıyor.

Bağlantı Katmanı

Serverless tarafta uzun ömürlü bağlantılar çoğu zaman baş ağrıtıyor. Neon’un HTTP tabanlı yapısı burada bana daha uyumlu geldi. Özellikle Vercel üzerinde gereksiz bağlantı karmaşası yaşamadan daha hafif bir veri katmanı kurabildim.

ts
import { drizzle } from 'drizzle-orm/neon-http'
import { neon } from '@neondatabase/serverless'
import * as schema from './schema'

const sql = neon(process.env.DATABASE_URL!)
export const db = drizzle(sql, { schema })

Sorgu Yazarken His

Drizzle’da en sevdiğim şey, SQL’e daha yakın hissettirmesi. Ne yazdığını ve bunun arkada neye döneceğini daha rahat tahmin ediyorsun. Özellikle performans tarafına bakarken bu daha kontrollü hissettiriyor.

ts
return db
  .select({
    id: clients.id,
    name: clients.name,
    ageGroup: clients.ageGroup,
    lastSessionAt: sessions.startedAt,
  })
  .from(clients)
  .leftJoin(sessions, eq(sessions.clientId, clients.id))
  .where(eq(clients.createdBy, therapistId))

Migration Konusunda Disiplin

Geliştirme ortamında `push` komutu rahat. Ama canlı tarafta daha kontrollü bir migration akışı çok daha güvenli. Özellikle sağlık ya da danışan verisi gibi hassas alanlarda bu konu hafife alınmamalı.

bash
npx drizzle-kit generate
npx drizzle-kit migrate

Dikkat

Geliştirme kolaylığı ile canlı sistem güvenliğini aynı komutta çözmeye çalışmak riskli. Production veritabanında kontrollü ilerlemek daha doğru.