Files
rogaining_srv/update_location2025_fields.py

116 lines
5.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python
"""
Location2025テーブルの新しいフィールドを旧Locationテーブルから更新するスクリプト
"""
import os
import sys
import django
# Django設定
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'rogaining_srv.settings')
django.setup()
from rog.models import Location2025, Location
from django.db import transaction
def update_location2025_from_old_location():
"""
旧Locationテーブルから Location2025 の新しいフィールドを更新
"""
print("=== Location2025フィールド更新開始 ===")
# 更新対象のフィールドマッピング
field_mapping = {
'category': 'category',
'zip_code': 'zip', # Location2025.zip_code <- Location.zip
'prefecture': 'prefecture',
'area': 'area',
'city': 'city',
'facility': 'facility'
}
updated_count = 0
not_found_count = 0
try:
with transaction.atomic():
location2025_records = Location2025.objects.all()
total_records = location2025_records.count()
print(f"処理対象レコード数: {total_records}")
for i, loc2025 in enumerate(location2025_records, 1):
if i % 100 == 0:
print(f"進行状況: {i}/{total_records}")
# location_idまたはcp_nameで旧Locationテーブルから対応するレコードを検索
old_location = None
# まずlocation_idで検索sub_loc_idがlocation_idの可能性
if loc2025.sub_loc_id:
try:
location_id = int(loc2025.sub_loc_id)
old_location = Location.objects.filter(location_id=location_id).first()
except (ValueError, TypeError):
pass
# location_idで見つからない場合、location_nameで検索
if not old_location:
old_location = Location.objects.filter(location_name=loc2025.cp_name).first()
# 部分一致で検索
if not old_location and loc2025.cp_name:
old_location = Location.objects.filter(location_name__icontains=loc2025.cp_name).first()
if old_location:
# フィールドを更新
updated = False
for loc2025_field, location_field in field_mapping.items():
if hasattr(old_location, location_field):
old_value = getattr(old_location, location_field)
if old_value: # 値が存在する場合のみ更新
# zip_codeの場合、〒記号を除去
if loc2025_field == 'zip_code' and old_value.startswith(''):
old_value = old_value[1:]
setattr(loc2025, loc2025_field, old_value)
updated = True
if updated:
loc2025.save()
updated_count += 1
if i <= 5: # 最初の5件の詳細を表示
print(f" 更新: CP{loc2025.cp_number} {loc2025.cp_name}")
print(f" Category: {loc2025.category}")
print(f" Area: {loc2025.area}, Prefecture: {loc2025.prefecture}")
print(f" City: {loc2025.city}, Zip: {loc2025.zip_code}")
print(f" Facility: {loc2025.facility}")
else:
not_found_count += 1
if not_found_count <= 5: # 最初の5件のエラーを表示
print(f" 見つからない: CP{loc2025.cp_number} {loc2025.cp_name} (sub_loc_id: {loc2025.sub_loc_id})")
print(f"\n=== 更新完了 ===")
print(f"更新されたレコード数: {updated_count}")
print(f"対応するLocationが見つからないレコード数: {not_found_count}")
# 更新結果のサンプルを表示
print(f"\n=== 更新後サンプル ===")
updated_samples = Location2025.objects.exclude(category__isnull=True).exclude(category='')[:3]
for sample in updated_samples:
print(f"CP{sample.cp_number}: {sample.cp_name}")
print(f" Category: {sample.category}")
print(f" Location: {sample.prefecture} {sample.area} {sample.city}")
print(f" Zip: {sample.zip_code}, Facility: {sample.facility}")
print()
except Exception as e:
print(f"エラーが発生しました: {e}")
raise
if __name__ == "__main__":
update_location2025_from_old_location()