# 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ライセンスの下で公開されています。