Agent Skills by ALSEL
Anthropic Claudeソフトウェア開発⭐ リポ 0品質スコア 50/100

db-seed

データベースへのシードスクリプトをリアルなサンプルデータとともに生成します。DrizzleスキーマまたはSQLマイグレーションを読み込み、外部キーの順序を考慮しながら、冪等性のあるTypeScriptまたはSQLのシードファイルを出力します。D1のバッチ制限・一意制約・ドメインに適したデータにも対応しており、開発・デモ・テスト用データベースへのデータ投入が必要な際に活用できます。

description の原文を見る

Generate database seed scripts with realistic sample data. Reads Drizzle schemas or SQL migrations, respects foreign key ordering, produces idempotent TypeScript or SQL seed files. Handles D1 batch limits, unique constraints, and domain-appropriate data. Use when populating dev/demo/test databases. Triggers: 'seed database', 'seed data', 'sample data', 'populate database', 'db seed', 'test data', 'demo data', 'generate fixtures'.

SKILL.md 本文

データベース シード ジェネレータ

データベースに現実的でドメインに適したサンプルデータを投入するシードスクリプトを生成します。スキーマを読み込んで、すぐに実行可能なシードファイルを出力します。

ワークフロー

1. スキーマを探す

プロジェクト内のスキーマ定義をスキャンします:

ソースロケーションパターン
Drizzle スキーマsrc/db/schema.ts, src/schema/*.ts, db/schema.ts
D1 マイグレーションdrizzle/*.sql, migrations/*.sql
Raw SQLschema.sql, db/*.sql
Prismaprisma/schema.prisma

すべてのスキーマファイルを読み込みます。次の項目の全体像を構築します:

  • テーブルとそのカラム
  • データ型と制約 (NOT NULL, UNIQUE, DEFAULT)
  • 外部キーの関係性 (どのテーブルがどのテーブルを参照しているか)
  • JSON フィールドが TEXT として保存されているもの (D1/SQLite では一般的)

2. シード パラメータを決定する

ユーザーに質問します:

パラメータオプションデフォルト
目的dev、demo、testingdev
ボリュームsmall (5-10 行/テーブル)、medium (20-50)、large (100+)small
ドメイン コンテキスト"e-commerce store"、"SaaS app"、"blog" などスキーマから推測
出力形式TypeScript (Drizzle)、raw SQL、または両方プロジェクトの ORM に合わせる

目的はデータ品質に影響します:

  • dev: 多様なデータ、いくつかのエッジケース (空のフィールド、長い文字列、Unicode)
  • demo: スクリーンショットやプレゼンテーションで見栄えの良いデータ
  • testing: 境界条件、重複、特殊文字をカバーするシステマティックなデータ

3. 挿入順序を計画する

外部キーから依存性グラフを構築します。親テーブルを子テーブルの前に挿入します。

ブログスキーマの例:

1. users        (依存関係なし)
2. categories   (依存関係なし)
3. posts        (users、categories に依存)
4. comments     (users、posts に依存)
5. tags         (依存関係なし)
6. post_tags    (posts、tags に依存)

循環依存: テーブル A が B を参照し、B が A を参照している場合、nullable 外部キーを使用して、2 パスで挿入します (NULL で挿入してから UPDATE)。

4. リアルなデータを生成する

"test123"、"foo@bar.com"、"Lorem ipsum" のような汎用プレースホルダーを使用しないでください。ドメインに合致するデータを生成してください。

データ生成パターン (外部ライブラリは不要)

名前: ハードコードされた一般的な名前のリストを使用します。性別と文化的背景を混ぜます。

const firstNames = ['Sarah', 'James', 'Priya', 'Mohammed', 'Emma', 'Wei', 'Carlos', 'Aisha'];
const lastNames = ['Chen', 'Smith', 'Patel', 'Garcia', 'Kim', 'O\'Brien', 'Nguyen', 'Wilson'];

メール: 名前から導出します — sarah.chen@example.comexample.com ドメインを使用します (RFC 2606 予約)。

日付: 現実的な範囲内で生成します。D1/SQLite には ISO 8601 形式を使用します。

const randomDate = (daysBack: number) => {
  const d = new Date();
  d.setDate(d.getDate() - Math.floor(Math.random() * daysBack));
  return d.toISOString();
};

ID: UUID には crypto.randomUUID() を使用するか、スキーマが自動増加を使用する場合は連続整数を使用します。

決定論的シード: 再現可能なデータの場合、シードされた PRNG を使用します:

function seededRandom(seed: number) {
  return () => {
    seed = (seed * 16807) % 2147483647;
    return (seed - 1) / 2147483646;
  };
}
const rand = seededRandom(42); // 同じシード = 毎回同じデータ

価格/金額: 現実的な範囲を使用します。$1-$10 の範囲の場合 (rand() * 900 + 100).toFixed(2)

説明/コンテンツ: コンテンツタイプごとに 3-5 個の現実的なバリエーションを書いて、それらをサイクルします。AI のような文章は生成しないでください — 実際のユーザーデータのように書きます。

5. 出力形式

TypeScript (Drizzle ORM)

// scripts/seed.ts
import { drizzle } from 'drizzle-orm/d1';
import * as schema from '../src/db/schema';

export async function seed(db: ReturnType<typeof drizzle>) {
  console.log('Seeding database...');

  // 既存データをクリア (逆依存順)
  await db.delete(schema.comments);
  await db.delete(schema.posts);
  await db.delete(schema.users);

  // ユーザーを挿入
  const users = [
    { id: crypto.randomUUID(), name: 'Sarah Chen', email: 'sarah@example.com', ... },
    // ...
  ];

  // D1 バッチ制限: INSERT ごとに 10 行
  for (let i = 0; i < users.length; i += 10) {
    await db.insert(schema.users).values(users.slice(i, i + 10));
  }

  // ポストを挿入 (ユーザーを参照)
  const posts = [
    { id: crypto.randomUUID(), userId: users[0].id, title: '...', ... },
    // ...
  ];

  for (let i = 0; i < posts.length; i += 10) {
    await db.insert(schema.posts).values(posts.slice(i, i + 10));
  }

  console.log(`Seeded: ${users.length} users, ${posts.length} posts`);
}

実行: npx tsx scripts/seed.ts

Cloudflare Workers の場合、シード エンドポイントを追加します (本番前に削除):

app.post('/api/seed', async (c) => {
  const db = drizzle(c.env.DB);
  await seed(db);
  return c.json({ ok: true });
});

Raw SQL (D1)

-- seed.sql
-- 実行: npx wrangler d1 execute DB_NAME --local --file=./scripts/seed.sql

-- 既存データをクリア (逆順)
DELETE FROM comments;
DELETE FROM posts;
DELETE FROM users;

-- ユーザー
INSERT INTO users (id, name, email, created_at) VALUES
  ('uuid-1', 'Sarah Chen', 'sarah@example.com', '2025-01-15T10:30:00Z'),
  ('uuid-2', 'James Wilson', 'james@example.com', '2025-02-01T14:22:00Z');

-- ポスト (D1 の場合最大 10 行/INSERT)
INSERT INTO posts (id, user_id, title, body, created_at) VALUES
  ('post-1', 'uuid-1', 'Getting Started', 'Welcome to...', '2025-03-01T09:00:00Z');

6. 冪等性

シードスクリプトは何度でも安全に再実行できる必要があります:

// オプション A: 削除後挿入 (シンプル、データ損失)
await db.delete(schema.users);
await db.insert(schema.users).values(seedUsers);

// オプション B: Upsert (非シードデータを保持)
for (const user of seedUsers) {
  await db.insert(schema.users)
    .values(user)
    .onConflictDoUpdate({ target: schema.users.id, set: user });
}

開発/テストにはオプション A をデフォルトとし、デモ (ユーザーが独自のデータを追加している可能性) にはオプション B を使用します。

D1 固有の落とし穴

落とし穴ソリューション
INSERT ごとに約 10 行が上限10 行ずつバッチで挿入
ネイティブ BOOLEAN がないINTEGER (0/1) を使用
ネイティブ DATETIME がないTEXT と ISO 8601 文字列を使用
JSON が TEXT として保存される挿入前に JSON.stringify() を実行
外部キーは常に強制される親テーブルを最初に挿入
100 バインドパラメータ制限バッチサイズ × カラム数 < 100 に保つ

品質ルール

  1. ドメインに合わせる — e-commerce シードには、"Product 1" ではなく、実在のような名前と価格の製品が含まれます
  2. データを変える — すべてのユーザーを "John Smith" にしたり、すべての価格を "$9.99" にしたりしないでください
  3. エッジケースを含める (テストシード用) — 空の文字列、非常に長いテキスト、特殊文字、最大値
  4. 実際の ID を参照する — 外部キーは実際に挿入された親行を指す必要があります
  5. シードされたものを出力する — ユーザーが機能したことを知るように、常にカウントをログに出力します
  6. 実行コマンドをドキュメント化する — ファイルの最上部のコメントに入れます

ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ

詳細情報

作者
jezweb
リポジトリ
jezweb/claude-skills
ライセンス
MIT
最終更新
不明

Source: https://github.com/jezweb/claude-skills / ライセンス: MIT

関連スキル

汎用ソフトウェア開発⭐ リポ 39,967

doubt-driven-development

重要な判断はすべて、本番環境への展開前に新しい視点から対抗的レビューを実施します。速度より正確性が重要な場合、不慣れなコードを扱う場合、本番環境・セキュリティに関わるロジック・取り消し不可の操作など影響度が高い場合、または後でバグを修正するよりも今検証する方が効率的な場合に活用してください。

by addyosmani
汎用ソフトウェア開発⭐ リポ 1,175

apprun-skills

TypeScriptを使用したAppRunアプリケーションのMVU設計に関する総合的なガイダンスが得られます。コンポーネントパターン、イベントハンドリング、状態管理(非同期ジェネレータを含む)、パラメータと保護機能を備えたルーティング・ナビゲーション、vistestを使用したテストに対応しています。AppRunコンポーネントの設計・レビュー、ルートの配線、状態フローの管理、AppRunテストの作成時に活用してください。

by yysun
OpenAIソフトウェア開発⭐ リポ 797

desloppify

コードベースのヘルスチェックと技術負債の追跡ツールです。コード品質、技術負債、デッドコード、大規模ファイル、ゴッドクラス、重複関数、コードスメル、命名規則の問題、インポートサイクル、結合度の問題についてユーザーが質問した場合に使用してください。また、ヘルススコアの確認、次の改善項目の提案、クリーンアップ計画の作成をリクエストされた際にも対応します。29言語に対応しています。

by Git-on-my-level
汎用ソフトウェア開発⭐ リポ 39,967

debugging-and-error-recovery

テストが失敗したり、ビルドが壊れたり、動作が期待と異なったり、予期しないエラーが発生したりした場合に、体系的な根本原因デバッグをガイドします。推測ではなく、根本原因を見つけて修正するための体系的なアプローチが必要な場合に使用してください。

by addyosmani
汎用ソフトウェア開発⭐ リポ 39,967

test-driven-development

テスト駆動開発により実装を進めます。ロジックの実装、バグの修正、動作の変更など、あらゆる場面で活用できます。コードが正常に動作することを証明する必要がある場合、バグ報告を受けた場合、既存機能を修正する予定がある場合に使用してください。

by addyosmani
汎用ソフトウェア開発⭐ リポ 39,967

incremental-implementation

変更を段階的に実施します。複数のファイルに影響する機能や変更を実装する場合に使用してください。大量のコードを一度に書こうとしている場合や、タスクが一度では完結できないほど大きい場合に活用します。

by addyosmani
本サイトは GitHub 上で公開されているオープンソースの SKILL.md ファイルをクロール・インデックス化したものです。 各スキルの著作権は原作者に帰属します。掲載に問題がある場合は info@alsel.co.jp または /takedown フォームよりご連絡ください。
原作者: jezweb · jezweb/claude-skills · ライセンス: MIT