Use Cases

How to Automate DB Migrations: Claude Code 활용 가이드

automate db migrations: Claude Code 활용. 실용적인 코드 예시와 단계별 가이드를 포함합니다.

DB마이그레이션の悩みをClaude Code로解決

스키마변경のたびに마이그레이션파일を手書きするのは手間がかかり、ミスも起きやすい作業です。Claude Code를 활용하면 스키마の설계변경から마이그레이션생성、시드 데이터데이터の업데이트まで一気に대응할 수 있습니다。

Prismaでの마이그레이션

스키마설계から마이그레이션実行まで

> Prisma스키마に다음의테이블를 추가해줘、마이그레이션を생성・適用して。
>
> 테이블: Order
> - id: UUID, 主キー
> - userId: User への外部キー
> - items: OrderItem[] (1対多)
> - totalAmount: Decimal
> - status: enum (pending, confirmed, shipped, delivered, cancelled)
> - createdAt, updatedAt

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)
}

그後、Claude Code는 自動で마이그레이션コマンドを実行します。

npx prisma migrate dev --name add_order_tables

Drizzleでの마이그레이션

Drizzle ORM를 사용하는場合も同様に指示할 수 있습니다。

> Drizzle ORMの스키마にOrder테이블를 추가해줘。
> 마이그레이션파일も생성して。
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),
}));

既存스키마の변경

カラム추가やリネームなど、既存테이블の변경も安全に処理할 수 있습니다。

> users 테이블に다음의변경を加えて。
> - phoneNumber カラムを추가(nullable)
> - name を firstName と lastName に分割
> - 既存데이터の移行ロジックも含めて

Claude Code는 데이터移行スクリプト付きの마이그레이션を생성します。

-- マイグレーション: 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);

-- 既存データの移行
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";

시드 데이터데이터の생성

개발用の테스트데이터も合わせて作れます。

> Order 테이블の시드 데이터데이터を20件생성して。
> 각ステータスが均等に分布するように。
> リアルなダミー데이터にして。

마이그레이션の安全性を확인

> 現在の마이그레이션履歴を확인して、
> 本番適用前に問題がないかチェックして。
> 특히데이터消失リスクのある변경を指摘して。

API개발でのDB연동パターン에 대해서는API개발を高速化する方法で解説しています。또한、CLAUDE.mdに데이터베이스関連のルールを書いておくと安全性が向上します。書き方のコツはCLAUDE.mdの書き方完全가이드를 참고하세요.

정리

Claude Code를 활용하면 DB스키마の설계から변경、마이그레이션생성、시드 데이터데이터생성まで一貫して자동화할 수 있습니다。특히데이터移行ロジックを含む複雑な마이그레이션で威力を発揮します。

Prismaの詳しい使い方はPrisma공식 문서、Claude Codeの機能에 대해서는Anthropic공식 문서를 참고하세요.

#Claude Code #database #migration #Prisma #Drizzle