Fix migration

This commit is contained in:
2025-08-25 18:49:33 +09:00
parent 6886ba15c8
commit 8e3f7024a2
12 changed files with 2254 additions and 20 deletions

205
MIGRATE_OLD_ROGDB_README.md Normal file
View File

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