6.6 KiB
6.6 KiB
Old RogDB → RogDB データ移行ガイド (エラー修正版)
概要
old_rogdb データベースの rog_* テーブルから rogdb データベースの rog_* テーブルへデータを移行するスクリプトです。
修正点 (v3)
- PostgreSQL予約語(
likeなど)のカラム名をクォートで囲む対応 - キャメルケースカラム名(
hasGoaled,deadlineDateTimeなど)の自動クォート対応 - NULL値の自動処理:NOT NULL制約違反を防ぐデフォルト値設定
- トランザクションエラー時の自動ロールバック機能強化
- データベース接続のautocommit設定でトランザクション問題を回避
- より堅牢なエラーハンドリング
- カラム名事前チェック機能の追加
- NULL値事前チェック機能の追加
NULL値デフォルト設定
以下のカラムで自動的にデフォルト値を設定:
trial,is_trial:Falseis_active:TruehasGoaled,hasParticipated:Falsepublic,class_*:True- その他のBoolean型: 一般的なデフォルト値
機能
- 自動テーブル構造比較
- UPSERT操作(存在する場合は更新、しない場合は挿入)
- 主キーベースの重複チェック
- 詳細な移行統計レポート
- 予約語カラムの自動クォート処理
- エラーハンドリングとロールバック
使用方法
1. Docker Compose での実行
# 基本実行
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タスクの使用
# 基本移行
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 接続設定
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 接続設定
ROGDB_HOST=postgres-db # デフォルト: postgres-db
ROGDB_NAME=rogdb # デフォルト: rogdb
ROGDB_USER=admin # デフォルト: admin
ROGDB_PASSWORD=admin123456 # デフォルト: admin123456
ROGDB_PORT=5432 # デフォルト: 5432
その他の設定
EXCLUDE_TABLES=table1,table2 # 除外するテーブル(カンマ区切り)
移行対象テーブル
スクリプトは rog_ で始まる全てのテーブルを自動検出し、以下の処理を行います:
主要テーブル(例)
rog_customuser- ユーザー情報rog_newevent2- イベント情報rog_team- チーム情報rog_member- メンバー情報rog_entry- エントリー情報rog_location2025- チェックポイント情報rog_checkpoint- チェックポイント記録- その他
rog_*テーブル
移行ロジック
- テーブル構造比較: 共通カラムのみを移行対象とする
- 主キーチェック: 既存レコードの有無を確認
- 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
...
✅ 全ての移行が正常に完了しました!
注意事項
- バックアップ推奨: 移行前にrogdbのバックアップを取得してください
- 権限確認: 両データベースへの読み書き権限が必要です
- 外部キー制約: 移行順序によっては外部キー制約エラーが発生する可能性があります
- 大量データ: 大量データの場合は時間がかかる場合があります
トラブルシューティング
よくあるエラー
1. 接続エラー
❌ データベース接続エラー: connection refused
対処法: データベースサービスが起動していることを確認
2. 権限エラー
❌ テーブル移行エラー: permission denied
対処法: データベースユーザーの権限を確認
3. 外部キー制約エラー
❌ レコード処理エラー: foreign key constraint
対処法: 依存関係のあるテーブルから先に移行
デバッグ方法
# ログレベルを上げて詳細情報を表示
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ライセンスの下で公開されています。