Files
rogaining_srv/MIGRATE_OLD_ROGDB_README.md
2025-08-25 18:49:33 +09:00

6.6 KiB
Raw Blame History

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 での実行

# 基本実行
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_* テーブル

移行ロジック

  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

対処法: 依存関係のあるテーブルから先に移行

デバッグ方法

# ログレベルを上げて詳細情報を表示
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ライセンスの下で公開されています。