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