Fix migration
This commit is contained in:
205
MIGRATE_OLD_ROGDB_README.md
Normal file
205
MIGRATE_OLD_ROGDB_README.md
Normal 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ライセンスの下で公開されています。
|
||||
Reference in New Issue
Block a user