Fix migration error
This commit is contained in:
293
migrate_old_fc_gifu_entries.py
Normal file
293
migrate_old_fc_gifu_entries.py
Normal file
@ -0,0 +1,293 @@
|
||||
#!/usr/bin/env python
|
||||
"""
|
||||
old_rogdb から rogdb へのFC岐阜エントリー移行スクリプト
|
||||
old_rogdbのFC岐阜イベント(event_id=10)のゼッケン番号付きエントリーを移行
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
import django
|
||||
|
||||
if __name__ == '__main__':
|
||||
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings')
|
||||
django.setup()
|
||||
|
||||
from django.db import connections, transaction
|
||||
from rog.models import NewEvent2, Team, Entry, NewCategory, CustomUser
|
||||
|
||||
print("=== old_rogdb から FC岐阜エントリー移行 ===")
|
||||
|
||||
try:
|
||||
# データベース接続を取得
|
||||
default_db = connections['default'] # rogdb
|
||||
old_db = connections.databases.get('old_rogdb')
|
||||
|
||||
if not old_db:
|
||||
print("❌ old_rogdb接続設定が見つかりません。別DB接続を試行します。")
|
||||
|
||||
# old_rogdbに直接接続してデータを取得
|
||||
import psycopg2
|
||||
|
||||
# old_rogdbへの直接接続
|
||||
old_conn = psycopg2.connect(
|
||||
host='postgres-db',
|
||||
database='old_rogdb',
|
||||
user='admin',
|
||||
password='admin123456'
|
||||
)
|
||||
|
||||
print("✅ old_rogdbに接続成功")
|
||||
|
||||
with old_conn.cursor() as old_cursor:
|
||||
# old_rogdbのFC岐阜エントリーデータを取得
|
||||
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;
|
||||
""")
|
||||
|
||||
old_fc_data = old_cursor.fetchall()
|
||||
print(f"\\n✅ old_rogdb FC岐阜エントリー: {len(old_fc_data)}件")
|
||||
|
||||
if old_fc_data:
|
||||
print("\\nold_rogdb FC岐阜データサンプル(最初の5件):")
|
||||
for i, (entry_id, team_id, zekken, label, team_name, cat_id, date, owner_id, cat_name) in enumerate(old_fc_data[:5]):
|
||||
print(f" {i+1}. Entry {entry_id}: Team '{team_name}' - ゼッケン{zekken} ({cat_name})")
|
||||
|
||||
# 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"\\n✅ FC岐阜イベント: {fc_event.event_name}")
|
||||
|
||||
# データ移行開始
|
||||
print("\\n=== old_rogdb から rogdb へデータ移行開始 ===")
|
||||
migrated_count = 0
|
||||
error_count = 0
|
||||
|
||||
for entry_id, team_id, zekken, label, team_name, cat_id, date, owner_id, cat_name in old_fc_data:
|
||||
try:
|
||||
with transaction.atomic():
|
||||
# カテゴリを取得または作成
|
||||
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}")
|
||||
else:
|
||||
category = None
|
||||
|
||||
# チームを取得または作成
|
||||
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
|
||||
}
|
||||
)
|
||||
|
||||
if team_created:
|
||||
print(f" チーム作成: {team_name} (ID: {team_id})")
|
||||
|
||||
# エントリーを作成
|
||||
entry, entry_created = Entry.objects.get_or_create(
|
||||
team=team,
|
||||
event=fc_event,
|
||||
defaults={
|
||||
'category': category,
|
||||
'date': date or fc_event.start_datetime,
|
||||
'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}")
|
||||
migrated_count += 1
|
||||
else:
|
||||
print(f" 🔄 既存エントリー: {team_name} - ゼッケン{zekken}")
|
||||
|
||||
except Exception as e:
|
||||
error_count += 1
|
||||
print(f" ❌ エラー: {team_name} - {e}")
|
||||
|
||||
old_conn.close()
|
||||
|
||||
print(f"\\n=== 移行完了 ===")
|
||||
print(f"移行成功: {migrated_count}件")
|
||||
print(f"エラー: {error_count}件")
|
||||
|
||||
# 最終確認
|
||||
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}")
|
||||
print("\\n🎉 FC岐阜イベントのゼッケン番号表示問題が解決されました!")
|
||||
print("\\n🎯 通過審査管理画面でFC岐阜を選択すると、ゼッケン番号が表示されるようになります。")
|
||||
else:
|
||||
print("❌ old_rogdbにもFC岐阜エントリーデータがありません")
|
||||
old_conn.close()
|
||||
|
||||
else:
|
||||
# 通常のDjango接続設定がある場合の処理
|
||||
with default_db.cursor() as cursor:
|
||||
# まずold_rogdbスキーマが存在するか確認
|
||||
cursor.execute("""
|
||||
SELECT schema_name FROM information_schema.schemata
|
||||
WHERE schema_name LIKE '%old%' OR schema_name LIKE '%rog%';
|
||||
""")
|
||||
schemas = cursor.fetchall()
|
||||
print(f"利用可能なスキーマ: {schemas}")
|
||||
|
||||
# old_rogdbデータベースに直接接続を試行
|
||||
cursor.execute("SELECT current_database();")
|
||||
current_db = cursor.fetchone()[0]
|
||||
print(f"現在のDB: {current_db}")
|
||||
|
||||
# データベース一覧を確認
|
||||
cursor.execute("""
|
||||
SELECT datname FROM pg_database
|
||||
WHERE datistemplate = false AND datname != 'postgres';
|
||||
""")
|
||||
databases = cursor.fetchall()
|
||||
print(f"利用可能なDB: {[db[0] for db in databases]}")
|
||||
|
||||
# old_rogdbのrog_entryデータを確認
|
||||
try:
|
||||
# 別データベースのテーブルにアクセスする方法を試行
|
||||
cursor.execute("""
|
||||
SELECT table_name FROM information_schema.tables
|
||||
WHERE table_schema = 'public'
|
||||
AND table_name LIKE '%entry%';
|
||||
""")
|
||||
entry_tables = cursor.fetchall()
|
||||
print(f"エントリー関連テーブル: {entry_tables}")
|
||||
|
||||
# FC岐阜関連のエントリーデータを確認
|
||||
# まず現在のDBで状況確認
|
||||
cursor.execute("""
|
||||
SELECT COUNT(*) FROM rog_entry WHERE event_id = 10;
|
||||
""")
|
||||
current_fc_entries = cursor.fetchone()[0]
|
||||
print(f"現在のDB FC岐阜エントリー: {current_fc_entries}件")
|
||||
|
||||
if current_fc_entries > 0:
|
||||
cursor.execute("""
|
||||
SELECT re.id, re.team_id, re.zekken_number, re.zekken_label,
|
||||
rt.team_name, re.category_id
|
||||
FROM rog_entry re
|
||||
JOIN rog_team rt ON re.team_id = rt.id
|
||||
WHERE re.event_id = 10
|
||||
AND re.zekken_number IS NOT NULL
|
||||
ORDER BY re.zekken_number
|
||||
LIMIT 10;
|
||||
""")
|
||||
fc_data = cursor.fetchall()
|
||||
|
||||
print(f"\\n✅ FC岐阜エントリーデータ(最初の10件):")
|
||||
for entry_id, team_id, zekken, label, team_name, cat_id in fc_data:
|
||||
print(f" Entry {entry_id}: Team {team_id} '{team_name}' - ゼッケン{zekken}")
|
||||
|
||||
# FC岐阜イベントを取得
|
||||
fc_event = NewEvent2.objects.filter(id=10).first()
|
||||
if not fc_event:
|
||||
print("❌ FC岐阜イベント(ID:10)が見つかりません")
|
||||
sys.exit(1)
|
||||
|
||||
print(f"\\n✅ FC岐阜イベント: {fc_event.event_name}")
|
||||
|
||||
# エントリーデータを新しいEntry modelに同期
|
||||
print("\\n=== エントリーデータ同期開始 ===")
|
||||
updated_count = 0
|
||||
|
||||
# 全FC岐阜エントリーを取得
|
||||
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
|
||||
FROM rog_entry re
|
||||
JOIN rog_team rt ON re.team_id = rt.id
|
||||
WHERE re.event_id = 10
|
||||
ORDER BY re.zekken_number;
|
||||
""")
|
||||
all_fc_data = cursor.fetchall()
|
||||
|
||||
for entry_id, team_id, zekken, label, team_name, cat_id, date, owner_id in all_fc_data:
|
||||
try:
|
||||
# チームを取得
|
||||
team = Team.objects.get(id=team_id)
|
||||
|
||||
# カテゴリを取得
|
||||
category = NewCategory.objects.get(id=cat_id) if cat_id else None
|
||||
|
||||
# エントリーを更新または作成
|
||||
entry, created = Entry.objects.update_or_create(
|
||||
team=team,
|
||||
event=fc_event,
|
||||
defaults={
|
||||
'category': category,
|
||||
'date': date or fc_event.start_datetime,
|
||||
'owner_id': owner_id,
|
||||
'zekken_number': int(zekken) if zekken else 0,
|
||||
'zekken_label': label or f"FC岐阜-{zekken}",
|
||||
'is_active': True,
|
||||
'hasParticipated': False,
|
||||
'hasGoaled': False
|
||||
}
|
||||
)
|
||||
|
||||
if created:
|
||||
print(f" ✅ エントリー作成: {team_name} - ゼッケン{zekken}")
|
||||
else:
|
||||
print(f" 🔄 エントリー更新: {team_name} - ゼッケン{zekken}")
|
||||
updated_count += 1
|
||||
|
||||
except Team.DoesNotExist:
|
||||
print(f" ⚠️ チーム{team_id}が見つかりません: {team_name}")
|
||||
except Exception as e:
|
||||
print(f" ❌ エラー: {e}")
|
||||
|
||||
print(f"\\n✅ 処理完了: {updated_count}件のエントリーを処理")
|
||||
|
||||
# 最終確認
|
||||
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}")
|
||||
print("\\n🎉 FC岐阜イベントのゼッケン番号表示問題が解決されました!")
|
||||
else:
|
||||
print("❌ 現在のDBにFC岐阜エントリーデータがありません")
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ データ確認エラー: {e}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ エラーが発生しました: {e}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
Reference in New Issue
Block a user