Fix migration error
This commit is contained in:
256
migrate_fc_gifu_complete.py
Normal file
256
migrate_fc_gifu_complete.py
Normal file
@ -0,0 +1,256 @@
|
||||
#!/usr/bin/env python
|
||||
"""
|
||||
old_rogdb から rogdb への包括的FC岐阜データ移行スクリプト
|
||||
Team → Member → Entry の順序で移行
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
import django
|
||||
|
||||
if __name__ == '__main__':
|
||||
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings')
|
||||
django.setup()
|
||||
|
||||
from django.db import transaction
|
||||
from rog.models import NewEvent2, Team, Entry, NewCategory, CustomUser, Member
|
||||
from datetime import datetime
|
||||
import psycopg2
|
||||
|
||||
print("=== FC岐阜包括データ移行(Team→Member→Entry順序)===")
|
||||
|
||||
try:
|
||||
# old_rogdbに直接接続
|
||||
old_conn = psycopg2.connect(
|
||||
host='postgres-db',
|
||||
database='old_rogdb',
|
||||
user='admin',
|
||||
password='admin123456'
|
||||
)
|
||||
|
||||
print("✅ old_rogdbに接続成功")
|
||||
|
||||
# FC岐阜イベントを確認
|
||||
fc_event = NewEvent2.objects.filter(id=10).first()
|
||||
if not fc_event:
|
||||
print("❌ FC岐阜イベント(ID:10)が見つかりません")
|
||||
old_conn.close()
|
||||
sys.exit(1)
|
||||
|
||||
print(f"✅ FC岐阜イベント: {fc_event.event_name}")
|
||||
print(f" 期間: {fc_event.start_datetime} - {fc_event.end_datetime}")
|
||||
|
||||
with old_conn.cursor() as old_cursor:
|
||||
# Step 1: FC岐阜のチームデータを取得・移行
|
||||
print("\\n=== Step 1: チーム移行 ===")
|
||||
old_cursor.execute("""
|
||||
SELECT DISTINCT rt.id, rt.team_name, rt.owner_id, rt.category_id,
|
||||
rc.category_name, rt.password, rt.trial
|
||||
FROM rog_team rt
|
||||
JOIN rog_entry re ON rt.id = re.team_id
|
||||
LEFT JOIN rog_newcategory rc ON rt.category_id = rc.id
|
||||
WHERE re.event_id = 10
|
||||
ORDER BY rt.id;
|
||||
""")
|
||||
|
||||
team_data = old_cursor.fetchall()
|
||||
print(f"FC岐阜関連チーム: {len(team_data)}件")
|
||||
|
||||
team_created_count = 0
|
||||
team_errors = 0
|
||||
|
||||
for team_id, team_name, owner_id, cat_id, cat_name, password, trial in team_data:
|
||||
try:
|
||||
# カテゴリを取得または作成
|
||||
category = None
|
||||
if cat_id and cat_name:
|
||||
category, cat_created = NewCategory.objects.get_or_create(
|
||||
id=cat_id,
|
||||
defaults={
|
||||
'category_name': cat_name,
|
||||
'category_number': cat_id
|
||||
}
|
||||
)
|
||||
if cat_created:
|
||||
print(f" カテゴリ作成: {cat_name}")
|
||||
|
||||
# チームを作成(メンバー制約を一時的に無視)
|
||||
team, team_created = Team.objects.get_or_create(
|
||||
id=team_id,
|
||||
defaults={
|
||||
'team_name': team_name,
|
||||
'owner_id': owner_id or 1,
|
||||
'category': category,
|
||||
'event_id': fc_event.id,
|
||||
'password': password or '',
|
||||
'trial': trial or False
|
||||
}
|
||||
)
|
||||
|
||||
if team_created:
|
||||
print(f" ✅ チーム作成: {team_name} (ID: {team_id})")
|
||||
team_created_count += 1
|
||||
else:
|
||||
print(f" 🔄 既存チーム: {team_name} (ID: {team_id})")
|
||||
|
||||
except Exception as e:
|
||||
team_errors += 1
|
||||
print(f" ❌ チームエラー: {team_name} - {e}")
|
||||
|
||||
# Step 2: メンバーデータを取得・移行
|
||||
print(f"\\n=== Step 2: メンバー移行 ===")
|
||||
old_cursor.execute("""
|
||||
SELECT rm.id, rm.team_id, rm.user_id, cu.firstname, cu.lastname, cu.email
|
||||
FROM rog_member rm
|
||||
JOIN rog_team rt ON rm.team_id = rt.id
|
||||
JOIN rog_entry re ON rt.id = re.team_id
|
||||
LEFT JOIN rog_customuser cu ON rm.user_id = cu.id
|
||||
WHERE re.event_id = 10
|
||||
ORDER BY rm.team_id, rm.id;
|
||||
""")
|
||||
|
||||
member_data = old_cursor.fetchall()
|
||||
print(f"FC岐阜関連メンバー: {len(member_data)}件")
|
||||
|
||||
member_created_count = 0
|
||||
member_errors = 0
|
||||
|
||||
for member_id, team_id, user_id, firstname, lastname, email in member_data:
|
||||
try:
|
||||
# チームを取得
|
||||
team = Team.objects.get(id=team_id)
|
||||
|
||||
# ユーザーを取得または作成
|
||||
user = None
|
||||
if user_id:
|
||||
try:
|
||||
user = CustomUser.objects.get(id=user_id)
|
||||
except CustomUser.DoesNotExist:
|
||||
# ユーザーが存在しない場合は作成
|
||||
user = CustomUser.objects.create(
|
||||
id=user_id,
|
||||
email=email or f"user{user_id}@example.com",
|
||||
firstname=firstname or "名前",
|
||||
lastname=lastname or "苗字",
|
||||
is_active=True
|
||||
)
|
||||
print(f" ユーザー作成: {firstname} {lastname}")
|
||||
|
||||
# メンバーを作成
|
||||
member, member_created = Member.objects.get_or_create(
|
||||
team=team,
|
||||
user=user,
|
||||
defaults={}
|
||||
)
|
||||
|
||||
if member_created:
|
||||
print(f" ✅ メンバー作成: {firstname} {lastname} -> {team.team_name}")
|
||||
member_created_count += 1
|
||||
else:
|
||||
print(f" 🔄 既存メンバー: {firstname} {lastname} -> {team.team_name}")
|
||||
|
||||
except Team.DoesNotExist:
|
||||
print(f" ⚠️ チーム{team_id}が見つかりません")
|
||||
except Exception as e:
|
||||
member_errors += 1
|
||||
print(f" ❌ メンバーエラー: {firstname} {lastname} - {e}")
|
||||
|
||||
# Step 3: エントリーデータを移行
|
||||
print(f"\\n=== Step 3: エントリー移行 ===")
|
||||
old_cursor.execute("""
|
||||
SELECT re.id, re.team_id, re.zekken_number, re.zekken_label,
|
||||
rt.team_name, re.category_id, re.date, re.owner_id,
|
||||
rc.category_name
|
||||
FROM rog_entry re
|
||||
JOIN rog_team rt ON re.team_id = rt.id
|
||||
LEFT JOIN rog_newcategory rc ON re.category_id = rc.id
|
||||
WHERE re.event_id = 10
|
||||
ORDER BY re.zekken_number;
|
||||
""")
|
||||
|
||||
entry_data = old_cursor.fetchall()
|
||||
print(f"FC岐阜エントリー: {len(entry_data)}件")
|
||||
|
||||
entry_created_count = 0
|
||||
entry_errors = 0
|
||||
|
||||
for entry_id, team_id, zekken, label, team_name, cat_id, date, owner_id, cat_name in entry_data:
|
||||
try:
|
||||
# チームを取得
|
||||
team = Team.objects.get(id=team_id)
|
||||
|
||||
# カテゴリを取得
|
||||
category = None
|
||||
if cat_id:
|
||||
try:
|
||||
category = NewCategory.objects.get(id=cat_id)
|
||||
except NewCategory.DoesNotExist:
|
||||
pass
|
||||
|
||||
# 日時を調整(イベント期間内に設定)
|
||||
entry_date = fc_event.start_datetime
|
||||
if date:
|
||||
try:
|
||||
# 既存の日付がイベント期間内かチェック
|
||||
if fc_event.start_datetime.date() <= date.date() <= fc_event.end_datetime.date():
|
||||
entry_date = date
|
||||
except:
|
||||
pass
|
||||
|
||||
# エントリーを作成
|
||||
entry, entry_created = Entry.objects.get_or_create(
|
||||
team=team,
|
||||
event=fc_event,
|
||||
defaults={
|
||||
'category': category,
|
||||
'date': entry_date,
|
||||
'owner_id': owner_id or 1,
|
||||
'zekken_number': int(zekken) if zekken else 0,
|
||||
'zekken_label': label or f"FC岐阜-{zekken}",
|
||||
'is_active': True,
|
||||
'hasParticipated': False,
|
||||
'hasGoaled': False
|
||||
}
|
||||
)
|
||||
|
||||
if entry_created:
|
||||
print(f" ✅ エントリー作成: {team_name} - ゼッケン{zekken}")
|
||||
entry_created_count += 1
|
||||
else:
|
||||
print(f" 🔄 既存エントリー: {team_name} - ゼッケン{zekken}")
|
||||
|
||||
except Team.DoesNotExist:
|
||||
print(f" ⚠️ チーム{team_id}が見つかりません: {team_name}")
|
||||
entry_errors += 1
|
||||
except Exception as e:
|
||||
entry_errors += 1
|
||||
print(f" ❌ エントリーエラー: {team_name} - {e}")
|
||||
|
||||
old_conn.close()
|
||||
|
||||
print(f"\\n=== 移行完了統計 ===")
|
||||
print(f"チーム作成: {team_created_count}件 (エラー: {team_errors}件)")
|
||||
print(f"メンバー作成: {member_created_count}件 (エラー: {member_errors}件)")
|
||||
print(f"エントリー作成: {entry_created_count}件 (エラー: {entry_errors}件)")
|
||||
|
||||
# 最終確認
|
||||
fc_entries = Entry.objects.filter(event=fc_event).order_by('zekken_number')
|
||||
print(f"\\n🎉 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}")
|
||||
|
||||
if fc_entries.count() > 10:
|
||||
print(f" ... 他 {fc_entries.count() - 10}件")
|
||||
|
||||
print("\\n🎉 FC岐阜イベントのゼッケン番号表示問題が解決されました!")
|
||||
print("🎯 通過審査管理画面でFC岐阜を選択すると、参加者のゼッケン番号が表示されるようになります。")
|
||||
else:
|
||||
print("❌ エントリーが作成されませんでした")
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ エラーが発生しました: {e}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
Reference in New Issue
Block a user