パス: ファイルパス(references/、../ln-*)は、このスキルディレクトリを基準とします。
ln-723-seed-data-generator
タイプ: L3 Worker
カテゴリ: 7XX Project Bootstrap
2 つのモードを備えた汎用シードデータジェネレーターです。MIGRATE(既存の ORM スキーマを解析)または GENERATE(エンティティ定義から作成)を選択できます。任意のターゲット形式(C#、TypeScript、Python、JSON、SQL)に出力します。
目的と範囲
| 項目 | 説明 |
|---|
| 入力 | ORM スキーマファイル(MIGRATE)またはエンティティリスト(GENERATE) |
| 出力 | ターゲット形式のシードデータファイル |
| モード | MIGRATE:既存の ORM を解析 → シードデータ。GENERATE:エンティティ定義 → シードデータ |
範囲の境界:
- ORM スキーマ定義を解析するか、エンティティリストを受け取ります
- 指定されたターゲット形式でシードデータを生成します
- faker ライブラリを使用して現実的なサンプルデータを作成します
- データベースのマイグレーション、EF Core の構成、ORM モデルは生成しません
モードの選択
| モード | 使用する場合 | 入力 | ソース |
|---|
| MIGRATE | TRANSFORM パイプライン — 既存の ORM スキーマが見つかった場合 | ORM スキーマファイル | Drizzle、Prisma、TypeORM、EF Core、SQLAlchemy、Django ORM |
| GENERATE | CREATE パイプライン — 既存のスキーマがない場合 | ln-700 Phase 0 のエンティティリスト | ユーザー提供またはスターターテンプレート(User、Role) |
GENERATE モードでエンティティリストを受け取らなかった場合は、User(id、name、email、role、createdAt)と Role(id、name、description)からなるスターターテンプレートを生成します。
ターゲット形式
| 形式 | 出力ファイル | Faker ライブラリ | 用途 |
|---|
| C# MockData | MockData.cs | Bogus | .NET プロジェクト |
| TypeScript fixtures | seed.ts | Faker.js | Node/React プロジェクト |
| Python factories | factories.py | Faker (Python) | Django/Flask プロジェクト |
| JSON | seed.json | — | API テスト、インポートスクリプト |
| SQL | seed.sql | — | DB への直接シード投入 |
ワークフロー
| フェーズ | 名前 | アクション | 出力 |
|---|
| 1 | 解析/定義 | 1A:ORM スキーマを解析(MIGRATE)または 1B:エンティティリストを受け取る(GENERATE) | エンティティモデル |
| 2 | 型のマッピング | 汎用の型マッピングをターゲット形式に適用 | ターゲット型定義 |
| 3 | シードデータの生成 | faker ベースの現実的なデータを含むシードファイルを作成 | シードデータファイル |
| 4 | 検証 | リレーションシップを検証し、構文を確認 | 有効なシードファイル |
フェーズ 1:解析/定義
1A:MIGRATE モード — ORM スキーマの解析
| 手順 | アクション | 参照 |
|---|
| 1A.1 | スキーマファイルを特定する | — |
| 1A.2 | ORM の種類を自動検出する | orm_patterns.md — ORM 自動検出テーブル |
| 1A.3 | テーブル/モデル定義を抽出する | orm_patterns.md — ORM ごとの解析セクション |
| 1A.4 | 型を含むカラム定義を抽出する | orm_patterns.md |
| 1A.5 | 制約(PK、FK、nullable、unique)を特定する | orm_patterns.md |
| 1A.6 | enum 定義を抽出する | orm_patterns.md |
1B:GENERATE モード — エンティティ定義の受け取り
| 手順 | アクション | 参照 |
|---|
| 1B.1 | オーケストレーターからエンティティリストを受け取る(またはスターターテンプレートを使用する) | — |
| 1B.2 | エンティティ定義(名前、フィールド、型)を解析する | — |
| 1B.3 | フィールド名からリレーションシップを推定する(userId → User への FK) | relationship_mapping.md |
| 1B.4 | デフォルトの制約を適用する(id = PK、*Id = FK) | — |
出力: カラム、型、制約を含むエンティティモデル。
フェーズ 2:型のマッピング
エンティティの型をターゲット形式の型に変換します。
| ステップ | 操作 | 参照 |
|---|
| 2.1 | ターゲット形式を選択します(オーケストレーターのパラメーターから) | — |
| 2.2 | カラムの型をターゲット形式にマッピングします | type_mapping.md — 汎用型マッピング表 |
| 2.3 | ターゲットごとに NULL 許容状態を決定します | type_mapping.md |
| 2.4 | 外部キーとリレーションシップをマッピングします | relationship_mapping.md |
| 2.5 | 名前をターゲットの規則に合わせて変換します | 以下の名前規則表を参照 |
ターゲット別の名前規則:
| ターゲット | クラス/モデル | プロパティ/フィールド | ファイル |
|---|
| C# | 単数形の PascalCase | PascalCase | PascalCase.cs |
| TypeScript | 単数形の PascalCase | camelCase | camelCase.ts |
| Python | 単数形の PascalCase | snake_case | snake_case.py |
| JSON | camelCase | camelCase | kebab-case.json |
| SQL | 複数形の snake_case | snake_case | snake_case.sql |
フェーズ 3:シードデータの生成
faker ライブラリを使用して、現実的なデータを含むシードファイルを作成します。
| ステップ | 操作 | 参照 |
|---|
| 3.1 | 生成順序を決定します(親 → 子) | relationship_mapping.md |
| 3.2 | すべてのエンティティの ID(GUID/UUID)を生成します | data_generation.md |
| 3.3 | faker を使用してフィールド値を生成します | data_generation.md、type_mapping.md — Faker の統合 |
| 3.4 | FK リレーションシップが有効であることを確認します(子が既存の親 ID を参照) | relationship_mapping.md |
| 3.5 | ターゲット形式でシードファイルを書き込みます | — |
Faker の統合ルール: 生成するすべてのシードファイルでは、現実的なデータを生成するために、決定論的シード(再現性を確保する固定シード値)を使用する faker ライブラリを必ず使用してください。
| ターゲット | Faker の設定 |
|---|
| C# | var faker = new Bogus.Faker(); Randomizer.Seed = new Random(42); |
| TypeScript | import { faker } from '@faker-js/faker'; faker.seed(42); |
| Python | from faker import Faker; fake = Faker(); Faker.seed(42) |
依存関係に基づく生成順序:
| 順序 | エンティティの種類 | 生成するタイミング |
|---|
| 1 | ルートエンティティ(FK なし) | 最初 |
| 2 | 第 1 レベルの子 | 親が存在した後 |
| 3 | 第 2 レベルの子 | 祖父母が存在した後 |
| N | 最も深い階層の子 | すべての祖先が存在した後 |
フェーズ 4:検証
| チェック | 方法 | 期待される結果 |
|---|
| 構文が有効 | 言語固有のチェック | 構文エラーがない |
| FK が有効 | 相互参照 | すべての FK が既存の ID を指している |
| 型が正しい | 型解析 | ターゲット形式に適した型 |
| 名前が規則に準拠 | パターンチェック | ターゲットごとの命名規則に準拠 |
| Faker が決定論的 | 同じシードで再実行 | 出力が同一 |
対応 ORM の検出
| ORM | 検出パターン | エコシステム |
|---|
| Drizzle | pgTable()、mysqlTable()、sqliteTable() | Node.js |
| Prisma | .prisma ファイル内の model X { 構文 | Node.js |
| TypeORM | @Entity()、@Column() デコレーター | Node.js |
| EF Core | DbContext、DbSet<>、[Table] 属性 | .NET |
| SQLAlchemy | Base = declarative_base()、Column() | Python |
| Django ORM | models.Model、models.CharField() | Python |
エンティティ変換ルール
| ソース | ターゲット | 変換 |
|---|
| テーブル名(複数形、snake_case) | クラス名(単数形、PascalCase) | user_profiles → UserProfile |
| カラム名(snake_case) | プロパティ名(ターゲットの規則に準拠) | created_at → CreatedAt / createdAt / created_at |
| Enum 名 | Enum 型(PascalCase) | status_enum → StatusEnum |
| FK カラム | ナビゲーションプロパティ | user_id → UserId / userId |
サンプルデータのガイドライン
| フィールドの種類 | サンプル数 | 分布 |
|---|
| ルートエンティティ | 3~5 件 | ステータス/優先度に変化をつける |
| 子エンティティ | 5~10 件 | 親全体に分散させる |
| リーフエンティティ | 10~20 件 | 現実的な多様性を持たせる |
重要なルール
- 単一責任: シードデータのみを生成し、ORM モデルやマイグレーションは生成しません
- 冪等性: 同じシードで再実行すると、同一の出力を生成できます
- 有効なリレーション: すべての FK は、存在する親 ID を参照する必要があります
- Faker の使用必須: リアルなデータには Faker ライブラリを使用し、ランダムな文字列は使用しません
- 決定論的なシーディング: 再実行時の再現性を確保するため、固定のシード値(42)を使用します
- 生成順序: 常に子より先に親を生成します
- モードの認識: MIGRATE はファイルを解析し、GENERATE は定義を受け付けます。両者を混在させないでください
完了の定義
リスクの軽減
| リスク | 検出方法 | 軽減策 |
|---|
| 不明な ORM 型 | 自動検出に失敗する | 警告を記録し、オーケストレーターに ORM のヒントを求める |
| 無効な型マッピング | 不明なカラム型 | フォールバックとして文字列を使用し、警告を記録する |
| FK の不整合 | FK が存在しない ID を参照する | 親を先に生成し、後から検証する |
| GENERATE にエンティティリストがない | 入力が空 | スターターテンプレート(User、Role)を使用する |
| 名前の衝突 | クラス名またはテーブル名が重複する | 機能名をプレフィックスとして付ける |
| 循環参照 | 循環を伴う自己参照 | 深さを制限し、グラフを検証する |
参照ファイル
| ファイル | 用途 |
|---|
references/orm_patterns.md | ORM の自動検出とスキーマ解析のパターン(Drizzle、Prisma、TypeORM、EF Core、SQLAlchemy、Django) |
references/type_mapping.md | 汎用的な型マッピング(ORM 非依存 → C#、TypeScript、Python)+ Faker の統合 |
references/data_generation.md | リアルなサンプルデータのパターンと生成ルール |
references/relationship_mapping.md | FK の処理、生成順序、リレーションの推論 |
バージョン: 3.0.0
最終更新日: 2026-02-07