Skip to content

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.

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 Worker env veya process.env’den DATABASE_URL alır (Hyperdrive string veya doğrudan Neon URL).
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"));
}

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.

1. drizzle-kit generate — Migration Dosyası Üretme

Section titled “1. drizzle-kit generate — Migration Dosyası Üretme”
Terminal window
npx drizzle-kit generate
  • app/db/schema.ts değ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”
Terminal window
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”
Terminal window
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.
KomutKullanımAvantaj
generateŞema değişikliği sonrası migration üretMigration geçmişi, rollback imkanı
migrateÜretilen migration’ları DB’ye uygulaProduction-safe, geçmiş takibi
pushHızlı şema güncelleme (dev)Hızlı, migration dosyası yok

Önerilen akış:

  1. Geliştirme: Şema değiştir → drizzle-kit push (hızlı test).
  2. Production hazırlık: drizzle-kit generate → migration dosyası üret.
  3. Production: drizzle-kit migrate → migration’ı uygula.
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).

Ş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.

  • 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ı.