Use Cases

Cara Mengotomatisasi Migrasi DB dengan Claude Code

Pelajari cara mengotomatisasi migrasi database menggunakan Claude Code. Dilengkapi contoh kode praktis dan panduan langkah demi langkah.

Selesaikan Masalah Migrasi DB dengan Claude Code

Menulis file migrasi secara manual setiap kali ada perubahan skema adalah pekerjaan yang merepotkan dan rawan kesalahan. Dengan Claude Code, mulai dari perubahan desain skema, generate migrasi, hingga pembaruan seed data bisa ditangani sekaligus.

Migrasi dengan Prisma

Dari Desain Skema Sampai Eksekusi Migrasi

> Tambahkan tabel berikut ke skema Prisma, lalu generate dan terapkan migrasi.
>
> Tabel: Order
> - id: UUID, primary key
> - userId: foreign key ke User
> - items: OrderItem[] (one-to-many)
> - totalAmount: Decimal
> - status: enum (pending, confirmed, shipped, delivered, cancelled)
> - createdAt, updatedAt

Berikut contoh skema yang di-generate Claude Code.

enum OrderStatus {
  pending
  confirmed
  shipped
  delivered
  cancelled
}

model Order {
  id          String      @id @default(uuid())
  userId      String
  user        User        @relation(fields: [userId], references: [id])
  items       OrderItem[]
  totalAmount Decimal     @db.Decimal(10, 2)
  status      OrderStatus @default(pending)
  createdAt   DateTime    @default(now())
  updatedAt   DateTime    @updatedAt

  @@index([userId])
  @@index([status])
}

model OrderItem {
  id        String @id @default(uuid())
  orderId   String
  order     Order  @relation(fields: [orderId], references: [id], onDelete: Cascade)
  productId String
  quantity  Int
  price     Decimal @db.Decimal(10, 2)
}

Setelahnya, Claude Code secara otomatis menjalankan perintah migrasi.

npx prisma migrate dev --name add_order_tables

Migrasi dengan Drizzle

Jika menggunakan Drizzle ORM, kamu juga bisa memberikan instruksi serupa.

> Tambahkan tabel Order ke skema Drizzle ORM.
> Generate juga file migrasi.
import { pgTable, uuid, decimal, timestamp, pgEnum } from "drizzle-orm/pg-core";
import { relations } from "drizzle-orm";
import { users } from "./users";

export const orderStatusEnum = pgEnum("order_status", [
  "pending", "confirmed", "shipped", "delivered", "cancelled",
]);

export const orders = pgTable("orders", {
  id: uuid("id").defaultRandom().primaryKey(),
  userId: uuid("user_id").notNull().references(() => users.id),
  totalAmount: decimal("total_amount", { precision: 10, scale: 2 }).notNull(),
  status: orderStatusEnum("status").default("pending").notNull(),
  createdAt: timestamp("created_at").defaultNow().notNull(),
  updatedAt: timestamp("updated_at").defaultNow().notNull(),
});

export const ordersRelations = relations(orders, ({ one, many }) => ({
  user: one(users, { fields: [orders.userId], references: [users.id] }),
  items: many(orderItems),
}));

Perubahan Skema yang Sudah Ada

Perubahan pada tabel yang sudah ada seperti penambahan atau rename kolom juga bisa diproses dengan aman.

> Terapkan perubahan berikut pada tabel users.
> - Tambahkan kolom phoneNumber (nullable)
> - Pecah name menjadi firstName dan lastName
> - Sertakan juga logika migrasi data yang sudah ada

Claude Code men-generate migrasi lengkap dengan script migrasi data.

-- Migrasi: split_user_name
ALTER TABLE "users" ADD COLUMN "first_name" VARCHAR(100);
ALTER TABLE "users" ADD COLUMN "last_name" VARCHAR(100);
ALTER TABLE "users" ADD COLUMN "phone_number" VARCHAR(20);

-- Migrasi data yang sudah ada
UPDATE "users"
SET
  "first_name" = split_part("name", ' ', 1),
  "last_name" = CASE
    WHEN array_length(string_to_array("name", ' '), 1) > 1
    THEN split_part("name", ' ', 2)
    ELSE ''
  END;

ALTER TABLE "users" ALTER COLUMN "first_name" SET NOT NULL;
ALTER TABLE "users" ALTER COLUMN "last_name" SET NOT NULL;
ALTER TABLE "users" DROP COLUMN "name";

Generate Seed Data

Data test untuk development juga bisa dibuat bersamaan.

> Buat 20 seed data untuk tabel Order.
> Distribusikan status secara merata.
> Gunakan data dummy yang realistis.

Konfirmasi Keamanan Migrasi

> Periksa riwayat migrasi saat ini,
> cek apakah ada masalah sebelum diterapkan ke produksi.
> Khususnya tunjukkan perubahan yang berisiko kehilangan data.

Untuk pola integrasi DB dalam pengembangan API, dijelaskan di Cara Mempercepat Pengembangan API. Selain itu, menulis aturan terkait database di CLAUDE.md akan meningkatkan keamanan. Untuk tips penulisannya, lihat Panduan Lengkap Menulis CLAUDE.md.

Summary

Dengan Claude Code, kamu bisa mengotomatisasi secara konsisten mulai dari desain skema DB, perubahan, generate migrasi, hingga pembuatan seed data. Terutama sangat powerful untuk migrasi kompleks yang melibatkan logika migrasi data.

Untuk penggunaan Prisma lebih detail, lihat Dokumentasi Resmi Prisma, dan untuk fitur Claude Code, lihat Dokumentasi Resmi Anthropic.

#Claude Code #database #migration #Prisma #Drizzle