add location migrate
This commit is contained in:
120
migrate_location_to_location2025_complete.py
Normal file
120
migrate_location_to_location2025_complete.py
Normal file
@ -0,0 +1,120 @@
|
||||
#!/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()
|
||||
Reference in New Issue
Block a user