jpskill.com
🛠️ 開発・MCP コミュニティ

planetscale

PlanetScaleは、YouTubeを支える技術を基にしたサーバーレスMySQLプラットフォームで、開発者がGitのようなブランチ機能でデータベース構築やスキーマ変更、サーバーレス環境向け接続管理を効率的に行うSkill。

📜 元の英語説明(参考)

Expert guidance for PlanetScale, the serverless MySQL platform built on Vitess (the database clustering system powering YouTube). Helps developers set up databases with Git-like branching for schema changes, non-blocking schema migrations, and connection pooling for serverless environments.

🇯🇵 日本人クリエイター向け解説

一言でいうと

PlanetScaleは、YouTubeを支える技術を基にしたサーバーレスMySQLプラットフォームで、開発者がGitのようなブランチ機能でデータベース構築やスキーマ変更、サーバーレス環境向け接続管理を効率的に行うSkill。

※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。

⚡ おすすめ: コマンド1行でインストール(60秒)

下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。

🍎 Mac / 🐧 Linux
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o planetscale.zip https://jpskill.com/download/15260.zip && unzip -o planetscale.zip && rm planetscale.zip
🪟 Windows (PowerShell)
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/15260.zip -OutFile "$d\planetscale.zip"; Expand-Archive "$d\planetscale.zip" -DestinationPath $d -Force; ri "$d\planetscale.zip"

完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。

💾 手動でダウンロードしたい(コマンドが難しい人向け)
  1. 1. 下の青いボタンを押して planetscale.zip をダウンロード
  2. 2. ZIPファイルをダブルクリックで解凍 → planetscale フォルダができる
  3. 3. そのフォルダを C:\Users\あなたの名前\.claude\skills\(Win)または ~/.claude/skills/(Mac)へ移動
  4. 4. Claude Code を再起動

⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。

🎯 このSkillでできること

下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。

📦 インストール方法 (3ステップ)

  1. 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
  2. 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
  3. 3. 展開してできたフォルダを、ホームフォルダの .claude/skills/ に置く
    • · macOS / Linux: ~/.claude/skills/
    • · Windows: %USERPROFILE%\.claude\skills\

Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。

詳しい使い方ガイドを見る →
最終更新
2026-05-18
取得日時
2026-05-18
同梱ファイル
1

📖 Skill本文(日本語訳)

※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。

PlanetScale — サーバーレス MySQL プラットフォーム

概要

PlanetScale は、Vitess (YouTube を支えるデータベースクラスタリングシステム) 上に構築されたサーバーレス MySQL プラットフォームです。開発者がスキーマ変更のための Git のようなブランチング、ノンブロッキングなスキーマ移行、およびサーバーレス環境のための接続プーリングを使用してデータベースをセットアップするのを支援します。

手順

CLI 操作

# PlanetScale CLI をインストール
brew install planetscale/tap/pscale

# 認証
pscale auth login

# データベースを作成
pscale database create my-app --region us-east

# データベースに接続 (ローカルプロキシを開きます)
pscale connect my-app main --port 3306
# これで、パスワードなしでアプリケーションを localhost:3306 に接続できます

# ブランチを作成 (スキーマ変更のための git branch のように)
pscale branch create my-app add-orders-table

# テストのためにブランチに接続
pscale connect my-app add-orders-table --port 3307

# ブランチでシェルを開く
pscale shell my-app add-orders-table

スキーマブランチング

-- "add-orders-table" ブランチで、スキーマを安全に変更
-- これらの変更は、マージするまでメインブランチには影響しません

CREATE TABLE orders (
  id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  user_id BIGINT NOT NULL,
  amount DECIMAL(10, 2) NOT NULL,
  currency VARCHAR(3) NOT NULL DEFAULT 'USD',
  status ENUM('pending', 'processing', 'completed', 'refunded') NOT NULL DEFAULT 'pending',
  metadata JSON,
  created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  INDEX idx_user_id (user_id),
  INDEX idx_status_created (status, created_at)
);

-- 既存のテーブルにカラムを追加
ALTER TABLE users ADD COLUMN stripe_customer_id VARCHAR(255);
ALTER TABLE users ADD INDEX idx_stripe_customer (stripe_customer_id);
# デプロイリクエストを作成 (スキーマ変更のためのプルリクエストのように)
pscale deploy-request create my-app add-orders-table

# デプロイリクエストを確認
pscale deploy-request diff my-app 1

# デプロイ (ノンブロッキング — ダウンタイムなし)
pscale deploy-request deploy my-app 1

# スキーマの変更は、テーブルをロックせずに適用されます
# PlanetScale は、内部で Vitess のオンライン DDL (gh-ost) を使用します

アプリケーション統合

// src/lib/db.ts — PlanetScale に接続
import { connect } from "@planetscale/database";

// サーバーレスドライバー (HTTP ベース、エッジ関数で動作)
const db = connect({
  host: process.env.DATABASE_HOST,
  username: process.env.DATABASE_USERNAME,
  password: process.env.DATABASE_PASSWORD,
});

// クエリ
async function getOrders(userId: string) {
  const results = await db.execute(
    "SELECT * FROM orders WHERE user_id = ? ORDER BY created_at DESC LIMIT 20",
    [userId]
  );
  return results.rows;
}

// 挿入
async function createOrder(order: { userId: string; amount: number; currency: string }) {
  const result = await db.execute(
    "INSERT INTO orders (user_id, amount, currency) VALUES (?, ?, ?)",
    [order.userId, order.amount, order.currency]
  );
  return result.insertId;
}

// トランザクション
async function processRefund(orderId: string) {
  await db.transaction(async (tx) => {
    await tx.execute(
      "UPDATE orders SET status = 'refunded' WHERE id = ? AND status = 'completed'",
      [orderId]
    );
    const order = await tx.execute("SELECT * FROM orders WHERE id = ?", [orderId]);
    await tx.execute(
      "INSERT INTO refunds (order_id, amount) VALUES (?, ?)",
      [orderId, order.rows[0].amount]
    );
  });
}

Prisma ORM と連携

// prisma/schema.prisma — Prisma と連携した PlanetScale
generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider     = "mysql"
  url          = env("DATABASE_URL")
  relationMode = "prisma"    // 必須: PlanetScale は外部キーをサポートしていません
}

model User {
  id        Int      @id @default(autoincrement())
  email     String   @unique
  name      String
  plan      String   @default("free")
  orders    Order[]
  createdAt DateTime @default(now()) @map("created_at")

  @@map("users")
}

model Order {
  id        Int      @id @default(autoincrement())
  userId    Int      @map("user_id")
  amount    Decimal  @db.Decimal(10, 2)
  status    String   @default("pending")
  user      User     @relation(fields: [userId], references: [id])
  createdAt DateTime @default(now()) @map("created_at")

  @@index([userId])
  @@index([status, createdAt])
  @@map("orders")
}
# Prisma 経由でスキーマの変更をプッシュ (ブランチ上)
pscale connect my-app add-orders-table --port 3309 &
DATABASE_URL="mysql://root@localhost:3309/my-app" npx prisma db push

インサイトとモニタリング

# クエリのインサイトを表示 (遅いクエリ、最も頻繁なクエリ)
pscale query-insights my-app main

# データベースのサイズと行数を表示
pscale database show my-app

# 監査ログ
pscale audit-log list my-app

インストール

# CLI
brew install planetscale/tap/pscale

# サーバーレスドライバー (Node.js)
npm install @planetscale/database

# Prisma と連携
npm install prisma @prisma/client

例 1: カスタム構成での Planetscale のセットアップ

ユーザーリクエスト:

Planetscale をインストールしたばかりです。好みのキーバインドを使用して、TypeScript + React ワークフロー用に構成するのを手伝ってください。

エージェントは、TypeScript 対応の設定で構成ファイルを作成し、React 開発に関連するプラグイン/拡張機能を構成し、ユーザーの好みに一致するキーボードショートカットを設定し、セットアップが正しく動作することを確認します。

例 2: カスタム機能による Planetscale の拡張

ユーザーリクエスト:

Planetscale にカスタムスキーマブランチングを追加したいです。どうすれば構築できますか?

エージェントは、拡張機能/プラグインプロジェクトをスキャフォールドし、Planetscale の API パターンに従ってコア機能を実装し、構成オプションを追加し、エンドツーエンドで動作することを確認するためのテスト手順を提供します。

ガイドライン

  1. すべてのスキーマ変更に対してブランチを作成 — メインを直接変更しないでください。ブランチを作成し、テストしてから、以下を使用してデプロイします。
📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開

PlanetScale — Serverless MySQL Platform

Overview

PlanetScale, the serverless MySQL platform built on Vitess (the database clustering system powering YouTube). Helps developers set up databases with Git-like branching for schema changes, non-blocking schema migrations, and connection pooling for serverless environments.

Instructions

CLI Operations

# Install PlanetScale CLI
brew install planetscale/tap/pscale

# Authenticate
pscale auth login

# Create a database
pscale database create my-app --region us-east

# Connect to your database (opens a local proxy)
pscale connect my-app main --port 3306
# Now connect your app to localhost:3306 with no password

# Create a branch (like git branch, for schema changes)
pscale branch create my-app add-orders-table

# Connect to the branch for testing
pscale connect my-app add-orders-table --port 3307

# Open a shell on the branch
pscale shell my-app add-orders-table

Schema Branching

-- On the "add-orders-table" branch, make schema changes safely
-- These changes don't affect the main branch until you merge

CREATE TABLE orders (
  id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  user_id BIGINT NOT NULL,
  amount DECIMAL(10, 2) NOT NULL,
  currency VARCHAR(3) NOT NULL DEFAULT 'USD',
  status ENUM('pending', 'processing', 'completed', 'refunded') NOT NULL DEFAULT 'pending',
  metadata JSON,
  created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  INDEX idx_user_id (user_id),
  INDEX idx_status_created (status, created_at)
);

-- Add columns to existing tables
ALTER TABLE users ADD COLUMN stripe_customer_id VARCHAR(255);
ALTER TABLE users ADD INDEX idx_stripe_customer (stripe_customer_id);
# Create a deploy request (like a pull request for schema changes)
pscale deploy-request create my-app add-orders-table

# Review the deploy request
pscale deploy-request diff my-app 1

# Deploy (non-blocking — zero downtime)
pscale deploy-request deploy my-app 1

# Schema changes are applied without locking tables
# PlanetScale uses Vitess's online DDL (gh-ost) under the hood

Application Integration

// src/lib/db.ts — Connect to PlanetScale
import { connect } from "@planetscale/database";

// Serverless driver (HTTP-based, works in edge functions)
const db = connect({
  host: process.env.DATABASE_HOST,
  username: process.env.DATABASE_USERNAME,
  password: process.env.DATABASE_PASSWORD,
});

// Query
async function getOrders(userId: string) {
  const results = await db.execute(
    "SELECT * FROM orders WHERE user_id = ? ORDER BY created_at DESC LIMIT 20",
    [userId]
  );
  return results.rows;
}

// Insert
async function createOrder(order: { userId: string; amount: number; currency: string }) {
  const result = await db.execute(
    "INSERT INTO orders (user_id, amount, currency) VALUES (?, ?, ?)",
    [order.userId, order.amount, order.currency]
  );
  return result.insertId;
}

// Transaction
async function processRefund(orderId: string) {
  await db.transaction(async (tx) => {
    await tx.execute(
      "UPDATE orders SET status = 'refunded' WHERE id = ? AND status = 'completed'",
      [orderId]
    );
    const order = await tx.execute("SELECT * FROM orders WHERE id = ?", [orderId]);
    await tx.execute(
      "INSERT INTO refunds (order_id, amount) VALUES (?, ?)",
      [orderId, order.rows[0].amount]
    );
  });
}

With Prisma ORM

// prisma/schema.prisma — PlanetScale with Prisma
generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider     = "mysql"
  url          = env("DATABASE_URL")
  relationMode = "prisma"    // Required: PlanetScale doesn't support foreign keys
}

model User {
  id        Int      @id @default(autoincrement())
  email     String   @unique
  name      String
  plan      String   @default("free")
  orders    Order[]
  createdAt DateTime @default(now()) @map("created_at")

  @@map("users")
}

model Order {
  id        Int      @id @default(autoincrement())
  userId    Int      @map("user_id")
  amount    Decimal  @db.Decimal(10, 2)
  status    String   @default("pending")
  user      User     @relation(fields: [userId], references: [id])
  createdAt DateTime @default(now()) @map("created_at")

  @@index([userId])
  @@index([status, createdAt])
  @@map("orders")
}
# Push schema changes via Prisma (on a branch)
pscale connect my-app add-orders-table --port 3309 &
DATABASE_URL="mysql://root@localhost:3309/my-app" npx prisma db push

Insights and Monitoring

# View query insights (slow queries, most frequent queries)
pscale query-insights my-app main

# View database size and row counts
pscale database show my-app

# Audit log
pscale audit-log list my-app

Installation

# CLI
brew install planetscale/tap/pscale

# Serverless driver (Node.js)
npm install @planetscale/database

# With Prisma
npm install prisma @prisma/client

Examples

Example 1: Setting up Planetscale with a custom configuration

User request:

I just installed Planetscale. Help me configure it for my TypeScript + React workflow with my preferred keybindings.

The agent creates the configuration file with TypeScript-aware settings, configures relevant plugins/extensions for React development, sets up keyboard shortcuts matching the user's preferences, and verifies the setup works correctly.

Example 2: Extending Planetscale with custom functionality

User request:

I want to add a custom schema branching to Planetscale. How do I build one?

The agent scaffolds the extension/plugin project, implements the core functionality following Planetscale's API patterns, adds configuration options, and provides testing instructions to verify it works end-to-end.

Guidelines

  1. Branch for every schema change — Never modify main directly; create a branch, test, then deploy via deploy request
  2. No foreign key constraints — PlanetScale (Vitess) doesn't support FK constraints; use relationMode = "prisma" or enforce in application code
  3. Serverless driver for edge — Use @planetscale/database (HTTP-based) for Vercel Edge, Cloudflare Workers; use mysql2 for Node.js servers
  4. Non-blocking migrations — PlanetScale applies ALTER TABLE without locking; deploy schema changes during business hours safely
  5. Deploy request review — Treat deploy requests like pull requests; review the diff before deploying to production
  6. Index before you need them — Add indexes on columns you filter/sort by; PlanetScale's query insights shows which queries need them
  7. Connection string from environment — Use pscale connect for local dev (no password needed); use connection strings in production
  8. Read replicas for read-heavy apps — PlanetScale supports read-only regions; route read queries to replicas for lower latency