Lewati ke konten utama
menjadi.dev
Chapter 17.11 API & Auth Menengah

Drizzle ORM: Migrations dan Database Kit

Kelola perubahan schema dan database operations dengan Drizzle Kit

Tujuan Pembelajaran

  • Bisa membuat dan menjalankan migrations
  • Mengerti Drizzle Kit commands
  • Bisa seed database dan manage schema

Analogi

Diagram

      Workflow:
1. Ubah schema (schema.ts)
2. Generate migration: drizzle-kit generate
3. Apply migration: drizzle-kit migrate
4. Rollback jika perlu
    

Drizzle Kit mengotomatisasi schema migrations dengan generate SQL files

Penjelasan Konsep

Seiring aplikasi berkembang, schema database pasti berubah: tambah tabel baru, tambah kolom, ubah tipe data, tambah index. Mengelola perubahan ini secara manual berisiko error dan inkonsistensi antar environment. Drizzle Kit adalah CLI tool untuk mengelola schema migrations.

Drizzle Kit Setup

Buat file konfigurasi drizzle.config.ts:

import { defineConfig } from 'drizzle-kit';

export default defineConfig({
  schema: './src/schema.ts',
  out: './drizzle',
  dialect: 'sqlite',
  dbCredentials: {
    url: './app.db',
  },
});

Generate Migrations

Setelah mengubah schema, generate migration file:

npx drizzle-kit generate

Drizzle Kit akan:

  1. Membandingkan schema saat ini dengan previous state
  2. Generate SQL migration file di folder drizzle/
  3. Beri nama dengan timestamp

Contoh output:

-- drizzle/0001_add_user_role.sql
ALTER TABLE users ADD COLUMN role text DEFAULT 'user';

Apply Migrations

npx drizzle-kit migrate

Push (Development Only)

Untuk development cepat tanpa manage migration files:

npx drizzle-kit push

Push akan langsung mengubah database schema tanpa membuat migration file.

Berguna saat prototyping.

Studio: GUI Database

Drizzle Kit punya built-in GUI untuk explore database:

npx drizzle-kit studio

Buka browser di localhost — kamu bisa lihat tabel, data, dan bahkan jalankan query!

Seeding Database

Untuk populate database dengan data awal:

// seed.ts
import { db } from './db';
import { users,

Products } from './schema';

async function seed() {
  await db.insert(users).values([
    { name: 'Admin', email: 'admin@mail.com', role: 'admin' },
    { name: 'User', email: 'user@mail.com', role: 'user' },
  ]);

  await db.insert(products).values([
    { name: 'Laptop', price: 12000000, stock: 10 },
    { name: 'Mouse', price: 250000, stock: 50 },
  ]);
}

seed();

Rollback Migrations

Drizzle belum punya built-in rollback command.

Untuk rollback, kamu bisa:

  1. Tulis migration down manual
  2. Gunakan snapshot system Drizzle
  3. Restore dari backup

Contoh Kode

typescript
// drizzle.config.ts
import { defineConfig } from 'drizzle-kit';

export default defineConfig({
  schema: './src/db/schema.ts',
  out: './drizzle/migrations',
  dialect: 'sqlite',
  dbCredentials: {
    url: './app.db',
  },
  introspect: {
    casing: 'camel',
  },
});

// db.ts - connection setup
import { Database } from 'bun:sqlite';
import { drizzle } from 'drizzle-orm/bun-sqlite';
import * as schema from './schema';

const sqlite = new Database('app.db');
export const db = drizzle(sqlite, { schema });

// Seed script
import { db } from './db';
import { users } from './schema';

async function seed() {
  console.log('Seeding database...');
  
  await db.delete(users); // Clear existing
  
  await db.insert(users).values([
    { name: 'Budi Santoso', email: 'budi@mail.com', role: 'admin' },
    { name: 'Ani Wijaya', email: 'ani@mail.com', role: 'user' },
    { name: 'Citra Dewi', email: 'citra@mail.com', role: 'user' },
  ]);
  
  console.log('Seeded 3 users');
}

seed().catch(console.error);

// package.json scripts
// "db:generate": "drizzle-kit generate"
// "db:migrate": "drizzle-kit migrate"
// "db:studio": "drizzle-kit studio"
// "db:seed": "bun run src/db/seed.ts"
// "db:push": "drizzle-kit push"

Penjelasan Kode

drizzle() menerima instance database dan schema untuk type-safe queries. { schema } opsional tapi direkomendasikan untuk relational queries.

Prompt AI

Setup Drizzle Studio dan eksplor database-mu melalui GUI. Tambahkan seed script untuk development data.

Pertanyaan Reflektif

Buat workflow CI/CD untuk automated database migrations saat deployment.