Use Cases

How to Automate DB Migrations with Claude Code

Learn how to automate db migrations using Claude Code. Includes practical code examples and step-by-step guidance.

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の書き方完全ガイドを参照してください。

Summary

Claude Codeを使えば、DBスキーマの設計から変更、マイグレーション生成、シードデータ作成まで一貫して自動化できます。特にデータ移行ロジックを含む複雑なマイグレーションで威力を発揮します。

Prismaの詳しい使い方はPrisma公式ドキュメント、Claude Codeの機能についてはAnthropic公式ドキュメントを参照してください。

#Claude Code #database #migration #Prisma #Drizzle