Drizzle ORM & Database
Veritabanı bağlantı yönetimi, şema yönetimi ve migration akışı (push vs migrate).
Coursio, veritabanı katmanında Drizzle ORM kullanır. Bu sayfa, bağlantı yönetimi (app/db/index.ts), şema yönetimi ve migration akışını (npx drizzle-kit push vs migrate) açıklar.
Veritabanı Bağlantı Yönetimi
Section titled “Veritabanı Bağlantı Yönetimi”app/db/index.ts
Section titled “app/db/index.ts”import { drizzle } from "drizzle-orm/neon-http";import { neon } from "@neondatabase/serverless";import * as schema from "./schema";
export const getDb = (connectionString: string) => { const sql = neon(connectionString); return drizzle(sql, { schema });};
export const getDbUrl = (env: any): string => { return env?.DATABASE_URL || process.env.DATABASE_URL || "";};Açıklama:
neon(connectionString): Neon HTTP driver — Edge uyumlu, HTTP üzerinden PostgreSQL sorguları.drizzle(sql, { schema }): Drizzle ORM instance — Type-safe sorgular ve şema tip kontrolü.getDbUrl(env): Cloudflare Workerenvveyaprocess.env’denDATABASE_URLalır (Hyperdrive string veya doğrudan Neon URL).
Route’larda Kullanım
Section titled “Route’larda Kullanım”import { getDb, getDbUrl } from "~/db/index";
export async function loader({ request, context }: any) { const env = context?.cloudflare?.env; const dbUrl = getDbUrl(env); const db = getDb(dbUrl);
// Type-safe sorgu const courses = await db.select().from(courses).where(eq(courses.status, "published"));}Şema Yönetimi
Section titled “Şema Yönetimi”Şema Dosyası: app/db/schema.ts
Section titled “Şema Dosyası: app/db/schema.ts”Drizzle şeması TypeScript ile tanımlanır:
import { pgTable, text, timestamp, boolean, uuid } from "drizzle-orm/pg-core";
export const users = pgTable("user", { id: text("id").primaryKey(), email: text("email").notNull().unique(), // ...});- Type-safe: Şema değişiklikleri TypeScript tip hatalarıyla yakalanır.
- Migration kaynağı:
drizzle-kit generateşemadan SQL migration üretir.
Migration Akışı
Section titled “Migration Akışı”1. drizzle-kit generate — Migration Dosyası Üretme
Section titled “1. drizzle-kit generate — Migration Dosyası Üretme”npx drizzle-kit generateapp/db/schema.tsdeğişikliklerini analiz eder.drizzle/klasörüne SQL migration dosyaları üretir (örn.drizzle/0017_payout_request_type.sql).- Kullanım: Production’da migration geçmişi tutmak için.
2. drizzle-kit migrate — Migration Uygulama
Section titled “2. drizzle-kit migrate — Migration Uygulama”npx drizzle-kit migrate- Üretilen migration dosyalarını (
drizzle/*.sql) veritabanına uygular. - Migration geçmişi takip edilir (hangi migration’lar uygulandı).
- Kullanım: Production ve staging ortamlarında.
3. drizzle-kit push — Doğrudan Şema Senkronizasyonu
Section titled “3. drizzle-kit push — Doğrudan Şema Senkronizasyonu”npx drizzle-kit push- Migration dosyası üretmeden şemayı doğrudan veritabanıyla senkronize eder.
- Hızlı, ancak migration geçmişi tutulmaz.
- Kullanım: Yalnızca geliştirme ortamında; production’da kullanmayın.
Ne Zaman Hangisi?
Section titled “Ne Zaman Hangisi?”| Komut | Kullanım | Avantaj |
|---|---|---|
generate | Şema değişikliği sonrası migration üret | Migration geçmişi, rollback imkanı |
migrate | Üretilen migration’ları DB’ye uygula | Production-safe, geçmiş takibi |
push | Hızlı şema güncelleme (dev) | Hızlı, migration dosyası yok |
Önerilen akış:
- Geliştirme: Şema değiştir →
drizzle-kit push(hızlı test). - Production hazırlık:
drizzle-kit generate→ migration dosyası üret. - Production:
drizzle-kit migrate→ migration’ı uygula.
drizzle.config.ts
Section titled “drizzle.config.ts”import { defineConfig } from "drizzle-kit";
export default defineConfig({ schema: "./app/db/schema.ts", out: "./drizzle", dialect: "postgresql", dbCredentials: { url: process.env.DATABASE_URL!, },});- schema: Şema dosyası yolu.
- out: Migration dosyalarının yazılacağı klasör.
- dialect: PostgreSQL.
- dbCredentials.url: Migration çalıştırırken kullanılacak
DATABASE_URL(Hyperdrive veya doğrudan Neon URL).
İlişkisel Model
Section titled “İlişkisel Model”Şema içinde foreign key ilişkileri tanımlanır:
export const courses = pgTable("course", { id: uuid("id").primaryKey(), instructorId: text("instructor_id").references(() => users.id), priceTierId: uuid("price_tier_id").references(() => priceTiers.id),});Drizzle, ilişkileri TypeScript tipleriyle yönetir; join sorguları type-safe’tir.
Detaylı şema ve ERD için Veritabanı Şeması sayfasına bakın.
İlgili Dosyalar
Section titled “İlgili Dosyalar”app/db/schema.ts— Drizzle şema tanımları.app/db/index.ts— getDb, getDbUrl; Hyperdrive veya DATABASE_URL.drizzle.config.ts— schema, out, dialect, dbCredentials.drizzle/— generate ile üretilen migration SQL dosyaları.