Files
rogaining_srv/migrate_fc_gifu_only.py
2025-08-29 09:11:20 +09:00

186 lines
8.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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()