Ulaşım
- Adres: 2342 Sk, İpekyol, İpek Ap 49A, 63250 Haliliye/Şanlıurfa
- Telefon:
0505 532 36 38 - eMail: admin@alestaweb.com
TypeScript projelerinde ORM seçimi (ORM selection in TypeScript projects), uygulamanızın performansını ve geliştirici deneyimini doğrudan etkiler. Alesta Web olarak bu yazımızda, 2026 itibarıyla en popüler iki TypeScript ORM olan Drizzle ORM ve Prisma'yı; bundle size, runtime performansı, type safety, migration yönetimi (migration management), edge runtime uyumluluğu ve geliştirici deneyimi açısından detaylı olarak karşılaştırıyoruz. Hangi durumda hangisini seçmeniz gerektiğini gerçek dünya projelerinden örneklerle anlatıyoruz (which one to choose with real-world examples).
Prisma, 2019'da yayınlanan, schema-first yaklaşımıyla popülerleşen bir TypeScript ORM'idir. schema.prisma dosyasında veritabanı şeması tanımlanır (database schema is defined in schema.prisma), CLI ile TypeScript client kodu generate edilir. Geliştirici deneyimi açısından sektör standardı sayılır (industry standard for DX).
Drizzle ORM, 2023'te öne çıkan, "SQL-like" sorgu syntax'ına sahip, sıfır bağımlılıklı (zero-dependency) ve edge runtime'lar için optimize edilmiş yeni nesil bir TypeScript ORM'idir. Şema, doğrudan TypeScript ile tanımlanır (schema defined directly in TypeScript), kod jenerasyonu (code generation) gerektirmez.
2026 itibarıyla npm'de Prisma haftalık ~3 milyon, Drizzle ise ~600 bin indirme alıyor (weekly downloads). Prisma daha popüler olsa da Drizzle'ın büyüme hızı (growth rate) çok daha yüksek.
| Özellik | Prisma | Drizzle |
|---|---|---|
| Schema tanımı | .prisma DSL | TypeScript native |
| Kod jenerasyonu | Gerekli (required) | Gerekmez (not required) |
| Sorgu syntax | Object-based DSL | SQL-like |
| Query engine | Rust binary (eski) / TS (yeni) | Pure TypeScript |
| Edge runtime | Sınırlı (limited) | Tam destek (full support) |
| Bağımlılık sayısı | Çoklu (multiple) | Sıfır (zero) |
npm install prisma @prisma/client npx prisma init
schema.prisma dosyası:
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?
createdAt DateTime @default(now())
posts Post[]
}
model Post {
id Int @id @default(autoincrement())
title String
authorId Int
author User @relation(fields: [authorId], references: [id])
}
Sonra:
npx prisma generate # TypeScript client üret npx prisma migrate dev # migration uygula
npm install drizzle-orm postgres npm install -D drizzle-kit
schema.ts dosyası (doğrudan TypeScript — directly TypeScript):
import { pgTable, serial, text, timestamp, integer } from 'drizzle-orm/pg-core';
import { relations } from 'drizzle-orm';
export const users = pgTable('users', {
id: serial('id').primaryKey(),
email: text('email').notNull().unique(),
name: text('name'),
createdAt: timestamp('created_at').defaultNow(),
});
export const posts = pgTable('posts', {
id: serial('id').primaryKey(),
title: text('title').notNull(),
authorId: integer('author_id').references(() => users.id),
});
export const usersRelations = relations(users, ({ many }) => ({
posts: many(posts),
}));
Drizzle'da kod jenerasyonu yok — type'lar şemanızdan otomatik infer edilir (types automatically inferred from schema). Migration için drizzle-kit kullanılır.
// Tüm kullanıcılar (all users)
const users = await prisma.user.findMany();
// Email ile bul (find by email)
const user = await prisma.user.findUnique({
where: { email: 'ahmet@example.com' }
});
// İlişkiyle birlikte (with relations)
const userWithPosts = await prisma.user.findUnique({
where: { id: 1 },
include: { posts: true }
});
import { eq } from 'drizzle-orm';
// Tüm kullanıcılar
const allUsers = await db.select().from(users);
// Email ile bul
const user = await db.select()
.from(users)
.where(eq(users.email, 'ahmet@example.com'));
// İlişkiyle birlikte (query API)
const userWithPosts = await db.query.users.findFirst({
where: eq(users.id, 1),
with: { posts: true }
});
// Prisma çoğu JOIN'i optimize eder ama bazen N+1 sorunu yaşatabilir
const result = await prisma.post.findMany({
where: { author: { name: { contains: 'Ahmet' } } },
include: { author: true },
orderBy: { createdAt: 'desc' },
take: 10
});
import { eq, like, desc } from 'drizzle-orm';
const result = await db
.select({
postId: posts.id,
title: posts.title,
authorName: users.name,
})
.from(posts)
.innerJoin(users, eq(posts.authorId, users.id))
.where(like(users.name, '%Ahmet%'))
.orderBy(desc(posts.createdAt))
.limit(10);
Drizzle, SQL'i bilen geliştiriciler için doğal hissedilir (feels natural for SQL-aware developers). Prisma ise SQL'den uzak duran developer'lara hitap eder. Karmaşık JOIN'lerde Drizzle daha esnek, basit CRUD'da Prisma daha az kod gerektirir.
Her iki ORM da güçlü type safety sunar (both offer strong type safety), ama yaklaşımları farklıdır.
import { User, Post } from '@prisma/client';
// Type'lar npx prisma generate ile üretilir
const user: User = await prisma.user.findUnique({ where: { id: 1 } });
Dezavantaj: Schema değişikliği sonrası prisma generate çalıştırmazsanız type'lar güncellenmez (types not updated unless you run prisma generate).
import { InferSelectModel, InferInsertModel } from 'drizzle-orm';
import { users } from './schema';
type User = InferSelectModel<typeof users>;
type NewUser = InferInsertModel<typeof users>;
// Type'lar otomatik infer edilir
const newUser: NewUser = { email: 'x@example.com', name: 'X' };
Avantaj: Şema TypeScript olduğu için type değişiklikleri anında reflect olur (changes reflect immediately).
Tom Sherman tarafından yapılan bağımsız benchmark sonuçları (independent benchmark results), PostgreSQL üzerinde 10.000 kayıt üzerinden:
| İşlem | Prisma (ms) | Drizzle (ms) | Raw SQL (ms) |
|---|---|---|---|
| SELECT (10k rows) | ~280ms | ~120ms | ~100ms |
| INSERT batch (1k rows) | ~520ms | ~250ms | ~230ms |
| JOIN sorgusu | ~340ms | ~150ms | ~140ms |
| UPDATE 1k rows | ~410ms | ~200ms | ~180ms |
Drizzle, raw SQL'e yakın performans gösterir (close to raw SQL performance). Prisma'nın query engine'i (eski versiyonlarda Rust binary) overhead getirir. Alesta Web ekibi: yoğun trafikli API'larda Drizzle ölçülebilir bir fark yarattığını gördük (measurable difference in high-traffic APIs).
| ORM | Min+gzip | Cold start |
|---|---|---|
| Prisma Client | ~3.5 MB | ~280ms |
| Drizzle ORM | ~7.4 KB | ~15ms |
Drizzle, Prisma'dan 500x daha küçük bundle üretir. Bu fark, Cloudflare Workers, Vercel Edge Functions, Deno Deploy gibi edge runtime'larda kritik (critical in edge runtimes).
Cloudflare Workers'ın 1MB limiti vardı (had 1MB limit) — Prisma direkt çalışmıyordu. Drizzle ise sıfırdan edge için tasarlandı (designed for edge from scratch). Prisma 5.10+ ile Driver Adapters üzerinden edge desteği geldi ama hâlâ bundle boyutu büyük.
# Schema değişikliği sonrası migration oluştur npx prisma migrate dev --name add_user_role # Production deploy npx prisma migrate deploy
Prisma migration'ları otomatik versionlanır (auto-versioned), shadow database ile diff hesaplanır. Kolay ama bazen istenmeyen DDL üretebilir (sometimes generates unwanted DDL).
# Migration generate (schema diff'ten) npx drizzle-kit generate # Migration'ı çalıştır npx drizzle-kit migrate # Drizzle Studio (görsel arayüz — visual UI) npx drizzle-kit studio
Drizzle Kit, schema TypeScript'ten SQL migration üretir. Üretilen SQL dosyaları manuel düzenlenebilir (can be manually edited) — Prisma'ya göre daha fazla kontrol (more control).
| Özellik | Prisma | Drizzle |
|---|---|---|
| PostgreSQL | ✅ | ✅ |
| MySQL/MariaDB | ✅ | ✅ |
| SQLite | ✅ | ✅ |
| MongoDB | ✅ | ❌ |
| SQL Server | ✅ | ⚠️ preview |
| Edge runtime | ⚠️ adapter ile | ✅ native |
| Studio (GUI) | ✅ Prisma Studio | ✅ Drizzle Studio |
| Raw SQL desteği | $queryRaw | sql template literal |
| Subqueries | Limitli | Tam destek |
| Window functions | Raw SQL gerekir | Native |
| JSON queries | İyi | Çok iyi (very good) |
2026'da yeni başlayan TypeScript projelerinde, eğer SQL'i biliyorsanız Drizzle daha modern bir tercih (more modern choice). Eğer ekibiniz junior'lardan oluşuyorsa veya hızlı prototip için ORM kullanıyorsanız Prisma hâlâ harika bir seçim. Her iki ORM da production-ready.
Alesta Web olarak benchmark'ları kendi ortamımızda da tekrarladık (we replicated the benchmarks in our own environment).
2026 itibarıyla TypeScript ORM seçimi (TypeScript ORM selection), uygulamanızın hedef platformuna (target platform), ekibinizin SQL bilgisine ve performans gereksinimlerine göre değişir. Drizzle ORM, modern web stack'ler için ideal bir alternatif sunarken; Prisma hâlâ olgun ve geliştirici dostu (developer-friendly) bir seçim olarak öne çıkıyor.
Faydalı Linkler / Useful Links:
Alesta Web ekibi olarak ORM seçiminde danışmanlık ihtiyaçlarınız için (for ORM selection consulting) alestaweb.com üzerinden bize ulaşabilirsiniz.
© 2026 AlestaWeb - Tüm hakları saklıdır.