# バッチ設計書 35-db:seed:replant

## 概要

本ドキュメントは、Railsフレームワークが提供するシードデータ再投入用Rakeタスク `db:seed:replant` の設計仕様について記載する。

### 本バッチの処理概要

`db:seed:replant` タスクは、各データベースの全テーブルをTRUNCATEしてから、シードデータを再投入するためのRakeタスクである。既存データを完全にクリアして初期状態からシードデータを投入する際に使用する。

**業務上の目的・背景**：開発環境やテスト環境において、データベースの状態を完全にクリーンな初期状態に戻す必要がある場合に使用される。`db:reset` と異なり、データベースの再作成やスキーマの再ロードを行わず、データのみをリフレッシュするため、高速に実行できる。テストデータの汚染をリセットしたい場合や、シードデータの変更を反映したい場合に特に有用である。

**バッチの実行タイミング**：開発者が手動で実行する随時タスクである。主に以下のタイミングで使用される：
- 開発中にテストデータが汚染された場合のリセット
- シードデータの変更後の再投入
- テスト環境のデータリフレッシュ

**主要な処理内容**：
1. `load_config` タスクを実行し、データベース設定をロード
2. `truncate_all` タスクを実行し、全テーブルをTRUNCATE
3. `db:seed` タスクを実行し、シードデータを投入

**前後の処理との関連**：
- 前提：データベースが作成済みで、スキーマがロードされていること
- 依存タスク：`truncate_all`（テーブルデータの削除）、`db:seed`（シードデータ投入）
- 関連タスク：`db:reset`（スキーマ含む完全リセット）

**影響範囲**：現在の環境のすべてのデータベースの全テーブルがTRUNCATEされ、データが削除される。その後、seeds.rbに定義されたデータのみが残る。外部キー制約がある場合は適切な順序でTRUNCATEが実行される。

## バッチ種別

データクレンジング / データ再投入

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 随時 |
| 実行時刻 | 任意 |
| 実行曜日 | 任意 |
| 実行日 | 任意 |
| トリガー | 手動（bin/rails db:seed:replant） |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| データベース存在 | 対象データベースが作成済みであること |
| スキーマロード済み | テーブル構造が構築されていること |
| マイグレーション適用済み | 未適用マイグレーションがないこと |
| シードファイル存在 | db/seeds.rb が存在すること |
| 環境保護チェック | 本番環境では DISABLE_DATABASE_ENVIRONMENT_CHECK=1 が必要 |

### 実行可否判定

- `check_protected_environments` により本番環境での実行は保護される
- `abort_if_pending_migrations`（db:seed内）で未適用マイグレーションをチェック
- データベースが存在しない場合はエラー

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| RAILS_ENV | 環境変数 | No | development | 対象環境を指定 |
| DISABLE_DATABASE_ENVIRONMENT_CHECK | 環境変数 | No | なし | 本番環境での実行を許可 |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| db/seeds.rb | Ruby | シードデータ定義ファイル |
| config/database.yml | YAML | データベース接続設定 |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| データベース | DB | TRUNCATEされた後、シードデータが投入されたテーブル |
| 標準出力 | テキスト | 処理結果メッセージ |

### 出力ファイル仕様

ファイル出力は行わない。データベースのデータ操作のみを実行する。

## 処理フロー

### 処理シーケンス

```
1. load_config
   └─ Railsアプリケーションとデータベース設定をロード
2. check_protected_environments（truncate_all内）
   └─ 本番環境保護のチェック
3. truncate_all タスク実行
   └─ 各データベース設定に対してループ
   └─ truncate_tables メソッドで全テーブルをTRUNCATE
4. db:seed タスク実行
   └─ abort_if_pending_migrations チェック
   └─ load_seed でシードデータ投入
```

### フローチャート

```mermaid
flowchart TD
    A[db:seed:replant 開始] --> B[設定ロード]
    B --> C[check_protected_environments]
    C --> D{保護対象環境?}
    D -->|Yes| E[エラー: 保護環境]
    D -->|No| F[truncate_all]
    F --> G[各DBの全テーブルをTRUNCATE]
    G --> H[db:seed]
    H --> I[abort_if_pending_migrations]
    I --> J{未適用マイグレーション?}
    J -->|あり| K[エラー: マイグレーション必要]
    J -->|なし| L[load_seed]
    L --> M[seeds.rb 実行]
    M --> N[db:seed:replant 完了]
    E --> O[処理中断]
    K --> O
```

## データベース操作仕様

### 操作別データベース影響一覧

| 処理 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| truncate_all | 全テーブル | TRUNCATE | 全データを高速削除 |
| db:seed | seeds.rb内で指定 | INSERT等 | シードデータ投入 |

### テーブル別操作詳細

#### 全ユーザーテーブル

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| TRUNCATE | - | - | テーブル内の全データを削除 |

**注意**:
- `schema_migrations` と `ar_internal_metadata` テーブルはTRUNCATE対象外
- 外部キー制約がある場合、適切な順序でTRUNCATEが実行される

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | 保護環境エラー | 本番環境で実行を試行 | DISABLE_DATABASE_ENVIRONMENT_CHECK=1 を設定 |
| - | PendingMigrationError | 未適用マイグレーションが存在 | db:migrate を実行 |
| - | ForeignKeyViolation | 外部キー制約違反 | TRUNCATE順序を確認（通常は自動処理） |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | なし（手動タスクのため） |
| リトライ間隔 | - |
| リトライ対象エラー | - |

### 障害時対応

1. エラーメッセージを確認し、原因を特定
2. 保護環境エラーの場合は環境変数を設定
3. 外部キー制約エラーの場合はデータベースの制約を確認
4. マイグレーションエラーの場合は `db:migrate` を実行

## トランザクション仕様

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | truncate_all: テーブル単位、db:seed: seeds.rb依存 |
| コミットタイミング | 各TRUNCATE完了時 |
| ロールバック条件 | TRUNCATE前にエラーが発生した場合 |

**注意**: TRUNCATEはDDL操作のため、多くのデータベースでは即座にコミットされる。

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | 全テーブル数 |
| 目標処理時間 | TRUNCATEは高速（DELETEより高速） |
| メモリ使用量上限 | 特に制限なし |

## 排他制御

- 同時実行は非推奨
- TRUNCATEはテーブルロックを取得する
- 他のプロセスからのアクセスがある場合は競合する可能性がある

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| 開始ログ | タスク開始時 | （標準では出力なし） |
| 進捗ログ | 処理中 | （seeds.rb内で実装） |
| 終了ログ | タスク終了時 | （標準では出力なし） |
| エラーログ | エラー発生時 | エラー詳細メッセージ |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| 処理時間 | プロジェクトに応じて設定 | 開発者 |
| エラー件数 | 1件以上 | 開発者 |

## 備考

- TRUNCATEはDELETEより高速だが、ロールバック不可能な場合がある
- `db:seed:replant` は `db:reset` より高速（スキーマの再構築を行わないため）
- 本番環境での使用は推奨されない（データが完全に失われる）
- 外部キー制約がある場合、`TRUNCATE ... CASCADE` または無効化/有効化が行われる（DBアダプタによる）
- `truncate_all` は内部的に `truncate_tables` メソッドを呼び出し、全テーブル名を取得してTRUNCATE
- seed_loaderの実装でシードデータの投入内容が決まる
