Files
rogaining_srv/migrate_location_to_location2025_complete.py
2025-08-30 03:48:07 +09:00

121 lines
4.4 KiB
Python

#!/usr/bin/env python
"""
LocationからLocation2025への完全データ移行スクリプト
条件:
- NewEvent2ごとにlocation.groupにそのevent_codeが含まれているものを抽出
- location.cpをlocation2025.cp_numberに変換
- location2025.event_idにはnewevent2.idを代入
実行前にlocation2025のデータを削除してから実行
"""
from rog.models import Location, Location2025, NewEvent2
def main():
print("=== Location から Location2025 への完全データ移行 ===")
# 1. Location2025の既存データを削除
print("\n1. Location2025の既存データを削除中...")
deleted_count = Location2025.objects.count()
Location2025.objects.all().delete()
print(f" 削除済み: {deleted_count}")
# 2. NewEvent2のevent_codeマップを作成
print("\n2. NewEvent2のevent_codeマップを作成中...")
events = NewEvent2.objects.filter(event_code__isnull=False).exclude(event_code='')
event_code_map = {}
for event in events:
event_code_map[event.event_code] = event
print(f" Event_code: '{event.event_code}' -> ID: {event.id} ({event.event_name})")
print(f" 有効なevent_code数: {len(event_code_map)}")
# 3. 全Locationを取得
print("\n3. 移行対象のLocationレコードを取得中...")
locations = Location.objects.all()
print(f" 総Location数: {locations.count()}")
# 4. 条件に合致するLocationを移行
print("\n4. データ移行中...")
migrated_count = 0
skipped_count = 0
error_count = 0
for location in locations:
try:
# groupが空の場合はスキップ
if not location.group:
skipped_count += 1
continue
# location.groupに含まれるevent_codeを検索
matched_event = None
matched_event_code = None
for event_code, event in event_code_map.items():
if event_code in location.group:
matched_event = event
matched_event_code = event_code
break
# マッチするevent_codeがない場合はスキップ
if not matched_event:
skipped_count += 1
continue
# Location2025レコードを作成
location2025 = Location2025(
cp_number=location.cp, # cpをcp_numberに代入
name=location.location_name, # location_nameを使用
description=location.address or '', # addressをdescriptionとして使用
latitude=location.latitude,
longitude=location.longitude,
point=location.checkin_point, # checkin_pointをpointとして使用
geom=location.geom,
sub_loc_id=location.sub_loc_id,
subcategory=location.subcategory,
event_id=matched_event.id, # NewEvent2のIDを設定
created_at=location.created_at,
updated_at=location.last_updated_at,
)
location2025.save()
print(f" ✅ 移行完了: {location.cp} -> {location2025.cp_number} ({location.location_name}) [Event: {matched_event_code}]")
migrated_count += 1
except Exception as e:
print(f" ❌ エラー: {location.cp} - {str(e)}")
error_count += 1
# 5. 結果サマリー
print(f"\n=== 移行結果サマリー ===")
print(f"移行完了: {migrated_count}")
print(f"スキップ: {skipped_count}")
print(f"エラー: {error_count}")
print(f"総処理: {migrated_count + skipped_count + error_count}")
# 6. Location2025の最終件数確認
final_count = Location2025.objects.count()
print(f"\nLocation2025最終件数: {final_count}")
# 7. event_id別の統計
print(f"\n=== event_id別統計 ===")
for event_code, event in event_code_map.items():
count = Location2025.objects.filter(event_id=event.id).count()
print(f" Event '{event_code}' (ID: {event.id}): {count}")
if migrated_count > 0:
print("\n✅ データ移行が正常に完了しました")
else:
print("\n⚠️ 移行されたデータがありません")
if __name__ == "__main__":
main()
if __name__ == "__main__":
main()