# Old RogDB → RogDB データ移行ガイド (エラー修正版)

## 概要
old_rogdb データベースの `rog_*` テーブルから rogdb データベースの `rog_*` テーブルへデータを移行するスクリプトです。

## 修正点 (v3)
- PostgreSQL予約語（`like`など）のカラム名をクォートで囲む対応
- **キャメルケースカラム名**（`hasGoaled`, `deadlineDateTime`など）の自動クォート対応
- **NULL値の自動処理**：NOT NULL制約違反を防ぐデフォルト値設定
- トランザクションエラー時の自動ロールバック機能強化
- データベース接続のautocommit設定でトランザクション問題を回避
- より堅牢なエラーハンドリング
- カラム名事前チェック機能の追加
- NULL値事前チェック機能の追加

### NULL値デフォルト設定
以下のカラムで自動的にデフォルト値を設定：
- `trial`, `is_trial`: `False`
- `is_active`: `True`
- `hasGoaled`, `hasParticipated`: `False`
- `public`, `class_*`: `True`
- その他のBoolean型: 一般的なデフォルト値

## 機能
- 自動テーブル構造比較
- UPSERT操作（存在する場合は更新、しない場合は挿入）
- 主キーベースの重複チェック
- 詳細な移行統計レポート
- 予約語カラムの自動クォート処理
- エラーハンドリングとロールバック

## 使用方法

### 1. Docker Compose での実行

```bash
# 基本実行
docker compose exec app python migrate_old_rogdb_to_rogdb.py

# 環境変数を使用した実行
docker compose exec -e OLD_ROGDB_HOST=old-postgres app python migrate_old_rogdb_to_rogdb.py

# 特定テーブルを除外
docker compose exec -e EXCLUDE_TABLES=rog_customuser,rog_session app python migrate_old_rogdb_to_rogdb.py
```

### 2. Makefileタスクの使用

```bash
# 基本移行
make migrate-old-rogdb

# カラム名チェックのみ
make check-columns

# NULL値チェックのみ
make check-null-values

# 完全な移行前チェック（カラム名 + NULL値）
make pre-migration-check

# 安全な移行（カラム名チェック + 移行実行）
make migrate-old-rogdb-safe

# 統計情報のみ表示
make migrate-rogdb-stats

# ドライラン（テーブル一覧のみ表示）
make migrate-rogdb-dryrun
```

## 環境変数

### Old RogDB 接続設定
```bash
OLD_ROGDB_HOST=postgres-db      # デフォルト: postgres-db
OLD_ROGDB_NAME=old_rogdb        # デフォルト: old_rogdb
OLD_ROGDB_USER=admin            # デフォルト: admin
OLD_ROGDB_PASSWORD=admin123456  # デフォルト: admin123456
OLD_ROGDB_PORT=5432             # デフォルト: 5432
```

### RogDB 接続設定
```bash
ROGDB_HOST=postgres-db          # デフォルト: postgres-db
ROGDB_NAME=rogdb                # デフォルト: rogdb
ROGDB_USER=admin                # デフォルト: admin
ROGDB_PASSWORD=admin123456      # デフォルト: admin123456
ROGDB_PORT=5432                 # デフォルト: 5432
```

### その他の設定
```bash
EXCLUDE_TABLES=table1,table2    # 除外するテーブル（カンマ区切り）
```

## 移行対象テーブル

スクリプトは `rog_` で始まる全てのテーブルを自動検出し、以下の処理を行います：

### 主要テーブル（例）
- `rog_customuser` - ユーザー情報
- `rog_newevent2` - イベント情報
- `rog_team` - チーム情報
- `rog_member` - メンバー情報
- `rog_entry` - エントリー情報
- `rog_location2025` - チェックポイント情報
- `rog_checkpoint` - チェックポイント記録
- その他 `rog_*` テーブル

### 移行ロジック
1. **テーブル構造比較**: 共通カラムのみを移行対象とする
2. **主キーチェック**: 既存レコードの有無を確認
3. **UPSERT操作**: 
   - 存在する場合: UPDATE（主キー以外のカラムを更新）
   - 存在しない場合: INSERT（新規追加）

## 出力例

```
================================================================================
Old RogDB → RogDB データ移行開始
================================================================================
データベースに接続中...
✅ データベース接続成功
old_rogdb rog_テーブル: 15個
rogdb rog_テーブル: 15個
共通 rog_テーブル: 15個
移行対象テーブル (15個): ['rog_customuser', 'rog_newevent2', ...]

=== rog_customuser データ移行開始 ===
共通カラム (12個): ['date_joined', 'email', 'first_name', ...]
主キー: ['id']
移行対象レコード数: 50件
  進捗: 50/50 件処理完了
✅ rog_customuser 移行完了:
  挿入: 25件
  更新: 25件
  エラー: 0件

================================================================================
移行完了サマリー
================================================================================
処理対象テーブル: 15個
総挿入件数: 1250件
総更新件数: 750件
総エラー件数: 0件

--- テーブル別詳細 ---
rog_customuser: 挿入25, 更新25, エラー0
rog_newevent2: 挿入10, 更新5, エラー0
...
✅ 全ての移行が正常に完了しました！
```

## 注意事項

1. **バックアップ推奨**: 移行前にrogdbのバックアップを取得してください
2. **権限確認**: 両データベースへの読み書き権限が必要です
3. **外部キー制約**: 移行順序によっては外部キー制約エラーが発生する可能性があります
4. **大量データ**: 大量データの場合は時間がかかる場合があります

## トラブルシューティング

### よくあるエラー

#### 1. 接続エラー
```
❌ データベース接続エラー: connection refused
```
**対処法**: データベースサービスが起動していることを確認

#### 2. 権限エラー
```
❌ テーブル移行エラー: permission denied
```
**対処法**: データベースユーザーの権限を確認

#### 3. 外部キー制約エラー
```
❌ レコード処理エラー: foreign key constraint
```
**対処法**: 依存関係のあるテーブルから先に移行

### デバッグ方法

```bash
# ログレベルを上げて詳細情報を表示
docker compose exec app python -c "
import logging
logging.basicConfig(level=logging.DEBUG)
exec(open('migrate_old_rogdb_to_rogdb.py').read())
"

# 特定テーブルのみテスト
docker compose exec app python -c "
from migrate_old_rogdb_to_rogdb import RogTableMigrator
migrator = RogTableMigrator()
migrator.connect_databases()
migrator.migrate_table_data('rog_customuser')
"
```

## ライセンス
このスクリプトはMITライセンスの下で公開されています。
