#!/usr/bin/env python """ gifuroge.event_table から rogdb.rog_newevent2 への移行スクリプト 移行条件: - event_day < '2024-10-01' のデータを移行 - self_rogaining = False として移行 - その他 = True として移行 フィールドマッピング: - gifuroge.event_table.event_code → rogdb.rog_newevent2.event_name - gifuroge.event_table.event_name → rogdb.rog_newevent2.event_description - gifuroge.event_table.event_day + start_time → rogdb.rog_newevent2.start_datetime - gifuroge.event_table.event_day + start_time + 5H → rogdb.rog_newevent2.end_datetime - gifuroge.event_table.event_day + start_time - 3day → rogdb.rog_newevent2.deadlineDateTime """ import os import sys import django from datetime import datetime, timedelta import psycopg2 if __name__ == '__main__': os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings') django.setup() from django.db import transaction from rog.models import NewEvent2 from django.utils import timezone import pytz print("=== gifuroge.event_table から rogdb.rog_newevent2 への移行 ===") # JST タイムゾーン設定 JST = pytz.timezone('Asia/Tokyo') def parse_datetime(event_day, start_time): """event_dayとstart_timeを結合してdatetimeオブジェクトを作成""" try: # event_dayの正規化 if isinstance(event_day, str): # スラッシュをハイフンに置換 if '/' in event_day: event_day = event_day.replace('/', '-') # 年が2桁の場合は20を付加 parts = event_day.split('-') if len(parts) == 3 and len(parts[0]) == 2: parts[0] = '20' + parts[0] event_day = '-'.join(parts) # start_timeの正規化(デフォルト値を設定) if not start_time or start_time == '': start_time = '09:00:00' # 時刻形式の確認と修正 if start_time.count(':') == 1: start_time = start_time + ':00' elif start_time.count(':') == 0: start_time = start_time + ':00:00' # datetimeオブジェクトの作成 datetime_str = f"{event_day} {start_time}" dt = datetime.strptime(datetime_str, '%Y-%m-%d %H:%M:%S') # JST タイムゾーンを設定 dt_jst = JST.localize(dt) return dt_jst except Exception as e: print(f"⚠️ 日時解析エラー: event_day={event_day}, start_time={start_time}, error={e}") # デフォルト値として現在時刻を返す return timezone.now() try: # gifuroge データベースに接続 gifuroge_conn = psycopg2.connect( host='postgres-db', database='gifuroge', user='admin', password='admin123456' ) print("✅ gifurogeデータベースに接続成功") with gifuroge_conn.cursor() as cursor: # 移行対象データの取得 print("\\n=== STEP 1: 移行対象データの確認 ===") cursor.execute(""" SELECT event_code, event_name, start_time, event_day FROM event_table WHERE event_day < '2024-10-01' AND event_code IS NOT NULL AND event_code != '' AND start_time > '07:00:00' ORDER BY event_day """) events_to_migrate = cursor.fetchall() print(f"移行対象イベント: {len(events_to_migrate)}件") if len(events_to_migrate) == 0: print("移行対象のイベントがありません。") gifuroge_conn.close() sys.exit(0) # データの確認表示 for event_code, event_name, start_time, event_day in events_to_migrate[:10]: print(f" {event_code}: {event_name} ({event_day} {start_time})") if len(events_to_migrate) > 10: print(f" ... 他 {len(events_to_migrate) - 10} 件") # 移行の実行 print(f"\\n=== STEP 2: データ移行の実行 ===") migrated_count = 0 updated_count = 0 error_count = 0 with transaction.atomic(): for event_code, event_name, start_time, event_day in events_to_migrate: try: # 日時の計算 start_datetime = parse_datetime(event_day, start_time) end_datetime = start_datetime + timedelta(hours=5) deadline_datetime = start_datetime - timedelta(days=3) # 既存データのチェックと更新または新規作成 existing_event = NewEvent2.objects.filter(event_name=event_code).first() if existing_event: # 既存データを更新 existing_event.event_description = event_name existing_event.start_datetime = start_datetime existing_event.end_datetime = end_datetime existing_event.deadlineDateTime = deadline_datetime existing_event.self_rogaining = False existing_event.status = 'public' existing_event.public = True existing_event.hour_5 = True existing_event.hour_3 = False existing_event.class_general = True existing_event.class_family = True existing_event.class_solo_male = True existing_event.class_solo_female = True existing_event.event_code = event_code existing_event.start_time = start_time existing_event.event_day = event_day existing_event.save() updated_count += 1 print(f"🔄 更新完了: {event_code}") else: # 新しいイベントレコードの作成 new_event = NewEvent2( event_name=event_code, # event_code → event_name event_description=event_name, # event_name → event_description start_datetime=start_datetime, end_datetime=end_datetime, deadlineDateTime=deadline_datetime, self_rogaining=False, # 指定条件 # その他=True に相当するフィールドがないため、コメントで記録 # 必要に応じてフィールドを追加する status='public', # デフォルトステータス public=True, # 公開設定 hour_5=True, # 5時間イベント hour_3=False, # 3時間イベントではない class_general=True, # 一般クラス有効 class_family=True, # ファミリークラス有効 class_solo_male=True, # 男子ソロクラス有効 class_solo_female=True, # 女子ソロクラス有効 # MobServer統合フィールドの設定 event_code=event_code, start_time=start_time, event_day=event_day ) new_event.save() migrated_count += 1 print(f"✅ 新規作成: {event_code}") except Exception as e: error_count += 1 print(f"❌ 移行エラー: {event_code} - {e}") continue print(f"\\n=== 移行結果 ===") print(f"新規作成: {migrated_count}件") print(f"更新完了: {updated_count}件") print(f"移行エラー: {error_count}件") print(f"合計処理: {migrated_count + updated_count + error_count}件") # 移行結果の確認 print(f"\\n=== 移行後データ確認 ===") migrated_events = NewEvent2.objects.filter( self_rogaining=False ).order_by('start_datetime') print(f"移行されたイベント数: {migrated_events.count()}件") for event in migrated_events[:10]: print(f" {event.event_name}: {event.event_description} ({event.start_datetime})") except Exception as e: print(f"❌ 移行処理でエラーが発生しました: {e}") import traceback traceback.print_exc() finally: if 'gifuroge_conn' in locals(): gifuroge_conn.close() print("✅ データベース接続を閉じました") print("\\n=== 移行処理完了 ===")