#!/usr/bin/env python """ FC岐阜イベント限定データ移行スクリプト FC岐阜イベントに関連するチーム・エントリーのみを移行して問題を解決 """ import os import sys import django if __name__ == '__main__': os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings') django.setup() from django.db import connection from rog.models import NewEvent2, Team, Entry, NewCategory, CustomUser print("=== FC岐阜イベント限定データ移行 ===") try: # FC岐阜イベントを確認 fc_event = NewEvent2.objects.filter(event_name__icontains='FC岐阜').first() if not fc_event: print("❌ FC岐阜イベントが見つかりません") sys.exit(1) print(f"✅ FC岐阜イベント: {fc_event.event_name} (ID: {fc_event.id})") with connection.cursor() as cursor: # まず、全体的なデータ構造を確認 print("\\n=== データベース構造調査 ===") # 1. rog_entry テーブルの全体状況 cursor.execute("SELECT COUNT(*) FROM rog_entry;") total_entries = cursor.fetchone()[0] print(f"総エントリー数: {total_entries}件") # 2. rog_entry のフィールド構造確認 cursor.execute(""" SELECT column_name, data_type, is_nullable FROM information_schema.columns WHERE table_name = 'rog_entry' ORDER BY ordinal_position; """) entry_columns = cursor.fetchall() print("\\nrog_entry テーブル構造:") for col_name, data_type, nullable in entry_columns: print(f" - {col_name}: {data_type} {'(NULL可)' if nullable == 'YES' else '(NOT NULL)'}") # 3. rog_team テーブルも確認(ゼッケン情報がチーム側にある可能性) cursor.execute(""" SELECT column_name, data_type, is_nullable FROM information_schema.columns WHERE table_name = 'rog_team' ORDER BY ordinal_position; """) team_columns = cursor.fetchall() print("\\nrog_team テーブル構造:") for col_name, data_type, nullable in team_columns: if 'zekken' in col_name.lower() or 'number' in col_name.lower(): print(f" 🎯 {col_name}: {data_type} {'(NULL可)' if nullable == 'YES' else '(NOT NULL)'}") else: print(f" - {col_name}: {data_type}") # 4. イベント別エントリー数確認 cursor.execute(""" SELECT e.id, e.event_name, COUNT(re.id) as entry_count FROM rog_newevent2 e LEFT JOIN rog_entry re ON e.id = re.event_id GROUP BY e.id, e.event_name ORDER BY entry_count DESC LIMIT 10; """) event_entries = cursor.fetchall() print("\\n=== イベント別エントリー数(上位10件) ===") for event_id, event_name, count in event_entries: print(f" Event {event_id}: '{event_name}' - {count}件") # 5. FC岐阜関連のより広範囲な検索 cursor.execute(""" SELECT re.*, rt.team_name, rt.zekken_number as team_zekken FROM rog_entry re JOIN rog_newevent2 e ON re.event_id = e.id JOIN rog_team rt ON re.team_id = rt.id WHERE e.event_name LIKE '%FC岐阜%' OR e.event_name LIKE '%fc岐阜%' OR e.event_name LIKE '%FC%' LIMIT 20; """) fc_entry_data = cursor.fetchall() print(f"\\n✅ FC岐阜関連エントリー(広範囲検索): {len(fc_entry_data)}件") if fc_entry_data: print("\\n🔍 FC岐阜関連データ詳細:") for row in fc_entry_data[:5]: # 最初の5件を表示 print(f" Entry ID: {row[0]}, Team: {row[-2]}, Team Zekken: {row[-1]}") # 6. チームテーブルでゼッケン番号がある場合を確認 cursor.execute(""" SELECT rt.id, rt.team_name, rt.zekken_number, rt.event_id FROM rog_team rt JOIN rog_newevent2 e ON rt.event_id = e.id WHERE e.event_name LIKE '%FC岐阜%' AND rt.zekken_number IS NOT NULL AND rt.zekken_number != '' ORDER BY CAST(rt.zekken_number AS INTEGER) LIMIT 20; """) team_zekken_data = cursor.fetchall() print(f"\\n✅ FC岐阜チームのゼッケン番号: {len(team_zekken_data)}件") if team_zekken_data: print("\\n🎯 チーム側のゼッケン番号データ:") for team_id, team_name, zekken, event_id in team_zekken_data[:10]: print(f" チーム{team_id}: {team_name} - ゼッケン{zekken}") # チーム側にゼッケン情報がある場合、それを使ってエントリーを作成 print("\\n=== チーム側ゼッケン情報からエントリー作成 ===") created_entries = 0 for team_id, team_name, zekken, event_id in team_zekken_data: # チームを取得 try: team = Team.objects.get(id=team_id) # エントリーを作成 entry, entry_created = Entry.objects.get_or_create( team=team, event=fc_event, defaults={ 'category': team.category, 'date': fc_event.start_datetime, 'owner': team.owner, 'zekken_number': int(zekken) if zekken.isdigit() else 0, 'zekken_label': f"FC岐阜-{zekken}", 'is_active': True, 'hasParticipated': False, 'hasGoaled': False } ) if entry_created: created_entries += 1 print(f" エントリー作成: {team_name} - ゼッケン{zekken}") except Team.DoesNotExist: print(f" ⚠️ チーム{team_id}が新DBに存在しません: {team_name}") except Exception as e: print(f" ❌ エラー: {e}") print(f"\\n✅ 作成されたエントリー: {created_entries}件") else: print("❌ チーム側にもゼッケン情報がありません") # 7. 最終確認 fc_entries = Entry.objects.filter(event=fc_event).order_by('zekken_number') print(f"\\n=== 最終結果 ===") print(f"FC岐阜イベント総エントリー: {fc_entries.count()}件") if fc_entries.exists(): print("\\n🎉 ゼッケン番号一覧(最初の10件):") for entry in fc_entries[:10]: print(f" ゼッケン{entry.zekken_number}: {entry.team.team_name}") print("\\n🎉 FC岐阜イベントのゼッケン番号表示問題が解決されました!") else: print("\\n❌ まだエントリーデータがありません") # 8. デバッグ用:全てのチームデータを確認 all_teams = Team.objects.all()[:10] print(f"\\n🔍 新DBの全チーム(最初の10件、総数: {Team.objects.count()}件):") for team in all_teams: entries = Entry.objects.filter(team=team) print(f" Team {team.id}: {team.team_name} (エントリー: {entries.count()}件)") # 9. FC岐阜イベントの詳細情報 print(f"\\n🔍 FC岐阜イベント詳細:") print(f" ID: {fc_event.id}") print(f" 名前: {fc_event.event_name}") print(f" 開始日: {fc_event.start_datetime}") print(f" 終了日: {fc_event.end_datetime}") except Exception as e: print(f"❌ エラーが発生しました: {e}") import traceback traceback.print_exc()