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
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:
- Membandingkan schema saat ini dengan previous state
- Generate SQL migration file di folder drizzle/
- 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:
- Tulis migration down manual
- Gunakan snapshot system Drizzle
- Restore dari backup
Contoh Kode
// 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
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.