Use Cases

如何Automate DB Migrations:Claude Code 实战指南

学习如何automate db migrations:Claude Code 实战. 包含实用代码示例和分步指导。

DB迁移の悩みを通过 Claude Code解決

Schema更改のたびに迁移文件を手書きするのは手間がかかり、ミスも起きやすい作業です。借助 Claude Code,Schemaの设计更改から迁移生成、种子数据数据の更新まで一気に支持可以。

Prismaでの迁移

Schema设计から迁移実行まで

> PrismaSchemaに以下表格添加、迁移を生成・適用して。
>
> 表格: Order
> - id: UUID, 主キー
> - userId: User への外部キー
> - items: OrderItem[] (1対多)
> - totalAmount: Decimal
> - status: enum (pending, confirmed, shipped, delivered, cancelled)
> - createdAt, updatedAt

Claude Code 生成するSchemaの例です。

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のSchemaに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),
}));

既存Schemaの更改

カラム添加やリネームなど、既存表格の更改も安全に処理可以。

> 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,DBSchemaの设计から更改、迁移生成、种子数据数据创建まで一貫して自动化可以。尤其数据移行ロジックを含む複雑な迁移で威力を発揮します。

Prismaの詳しい使い方はPrisma官方文档、Claude Codeの機能相关内容请参阅Anthropic官方文档

#Claude Code #database #migration #Prisma #Drizzle