186 lines
8.8 KiB
Python
186 lines
8.8 KiB
Python
|
|
#!/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()
|