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本体の挙動とは独立した参考情報です。
下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。
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
$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. 下の青いボタンを押して
planetscale.zipをダウンロード - 2. ZIPファイルをダブルクリックで解凍 →
planetscaleフォルダができる - 3. そのフォルダを
C:\Users\あなたの名前\.claude\skills\(Win)または~/.claude/skills/(Mac)へ移動 - 4. Claude Code を再起動
⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。
🎯 このSkillでできること
下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。
📦 インストール方法 (3ステップ)
- 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
- 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
- 3. 展開してできたフォルダを、ホームフォルダの
.claude/skills/に置く- · macOS / Linux:
~/.claude/skills/ - · Windows:
%USERPROFILE%\.claude\skills\
- · macOS / Linux:
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 パターンに従ってコア機能を実装し、構成オプションを追加し、エンドツーエンドで動作することを確認するためのテスト手順を提供します。
ガイドライン
- すべてのスキーマ変更に対してブランチを作成 — メインを直接変更しないでください。ブランチを作成し、テストしてから、以下を使用してデプロイします。
📜 原文 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
- Branch for every schema change — Never modify main directly; create a branch, test, then deploy via deploy request
- No foreign key constraints — PlanetScale (Vitess) doesn't support FK constraints; use
relationMode = "prisma"or enforce in application code - Serverless driver for edge — Use
@planetscale/database(HTTP-based) for Vercel Edge, Cloudflare Workers; use mysql2 for Node.js servers - Non-blocking migrations — PlanetScale applies ALTER TABLE without locking; deploy schema changes during business hours safely
- Deploy request review — Treat deploy requests like pull requests; review the diff before deploying to production
- Index before you need them — Add indexes on columns you filter/sort by; PlanetScale's query insights shows which queries need them
- Connection string from environment — Use
pscale connectfor local dev (no password needed); use connection strings in production - Read replicas for read-heavy apps — PlanetScale supports read-only regions; route read queries to replicas for lower latency