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公式ドキュメントを参照してください。
Related Posts
How to Supercharge Your Side Projects with Claude Code [With Examples]
How to Supercharge Your Side Projects with Claude Code [With Examples]. A practical guide with code examples.
How to Automate Refactoring with Claude Code
Learn how to automate refactoring using Claude Code. Includes practical code examples and step-by-step guidance.
Complete CORS Configuration Guide with Claude Code
Learn about complete cors configuration guide using Claude Code. Practical tips and code examples included.