Files
rogaining_srv/migrate_event_table_to_rog_newevent2.py
2025-08-29 09:11:20 +09:00

217 lines
9.5 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
"""
gifuroge.event_table から rogdb.rog_newevent2 への移行スクリプト
移行条件:
- event_day < '2024-10-01' のデータを移行
- self_rogaining = False として移行
- その他 = True として移行
フィールドマッピング:
- gifuroge.event_table.event_code → rogdb.rog_newevent2.event_name
- gifuroge.event_table.event_name → rogdb.rog_newevent2.event_description
- gifuroge.event_table.event_day + start_time → rogdb.rog_newevent2.start_datetime
- gifuroge.event_table.event_day + start_time + 5H → rogdb.rog_newevent2.end_datetime
- gifuroge.event_table.event_day + start_time - 3day → rogdb.rog_newevent2.deadlineDateTime
"""
import os
import sys
import django
from datetime import datetime, timedelta
import psycopg2
if __name__ == '__main__':
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings')
django.setup()
from django.db import transaction
from rog.models import NewEvent2
from django.utils import timezone
import pytz
print("=== gifuroge.event_table から rogdb.rog_newevent2 への移行 ===")
# JST タイムゾーン設定
JST = pytz.timezone('Asia/Tokyo')
def parse_datetime(event_day, start_time):
"""event_dayとstart_timeを結合してdatetimeオブジェクトを作成"""
try:
# event_dayの正規化
if isinstance(event_day, str):
# スラッシュをハイフンに置換
if '/' in event_day:
event_day = event_day.replace('/', '-')
# 年が2桁の場合は20を付加
parts = event_day.split('-')
if len(parts) == 3 and len(parts[0]) == 2:
parts[0] = '20' + parts[0]
event_day = '-'.join(parts)
# start_timeの正規化デフォルト値を設定
if not start_time or start_time == '':
start_time = '09:00:00'
# 時刻形式の確認と修正
if start_time.count(':') == 1:
start_time = start_time + ':00'
elif start_time.count(':') == 0:
start_time = start_time + ':00:00'
# datetimeオブジェクトの作成
datetime_str = f"{event_day} {start_time}"
dt = datetime.strptime(datetime_str, '%Y-%m-%d %H:%M:%S')
# JST タイムゾーンを設定
dt_jst = JST.localize(dt)
return dt_jst
except Exception as e:
print(f"⚠️ 日時解析エラー: event_day={event_day}, start_time={start_time}, error={e}")
# デフォルト値として現在時刻を返す
return timezone.now()
try:
# gifuroge データベースに接続
gifuroge_conn = psycopg2.connect(
host='postgres-db',
database='gifuroge',
user='admin',
password='admin123456'
)
print("✅ gifurogeデータベースに接続成功")
with gifuroge_conn.cursor() as cursor:
# 移行対象データの取得
print("\\n=== STEP 1: 移行対象データの確認 ===")
cursor.execute("""
SELECT event_code, event_name, start_time, event_day
FROM event_table
WHERE event_day < '2024-10-01'
AND event_code IS NOT NULL
AND event_code != ''
AND start_time > '07:00:00'
ORDER BY event_day
""")
events_to_migrate = cursor.fetchall()
print(f"移行対象イベント: {len(events_to_migrate)}")
if len(events_to_migrate) == 0:
print("移行対象のイベントがありません。")
gifuroge_conn.close()
sys.exit(0)
# データの確認表示
for event_code, event_name, start_time, event_day in events_to_migrate[:10]:
print(f" {event_code}: {event_name} ({event_day} {start_time})")
if len(events_to_migrate) > 10:
print(f" ... 他 {len(events_to_migrate) - 10}")
# 移行の実行
print(f"\\n=== STEP 2: データ移行の実行 ===")
migrated_count = 0
updated_count = 0
error_count = 0
with transaction.atomic():
for event_code, event_name, start_time, event_day in events_to_migrate:
try:
# 日時の計算
start_datetime = parse_datetime(event_day, start_time)
end_datetime = start_datetime + timedelta(hours=5)
deadline_datetime = start_datetime - timedelta(days=3)
# 既存データのチェックと更新または新規作成
existing_event = NewEvent2.objects.filter(event_name=event_code).first()
if existing_event:
# 既存データを更新
existing_event.event_description = event_name
existing_event.start_datetime = start_datetime
existing_event.end_datetime = end_datetime
existing_event.deadlineDateTime = deadline_datetime
existing_event.self_rogaining = False
existing_event.status = 'public'
existing_event.public = True
existing_event.hour_5 = True
existing_event.hour_3 = False
existing_event.class_general = True
existing_event.class_family = True
existing_event.class_solo_male = True
existing_event.class_solo_female = True
existing_event.event_code = event_code
existing_event.start_time = start_time
existing_event.event_day = event_day
existing_event.save()
updated_count += 1
print(f"🔄 更新完了: {event_code}")
else:
# 新しいイベントレコードの作成
new_event = NewEvent2(
event_name=event_code, # event_code → event_name
event_description=event_name, # event_name → event_description
start_datetime=start_datetime,
end_datetime=end_datetime,
deadlineDateTime=deadline_datetime,
self_rogaining=False, # 指定条件
# その他=True に相当するフィールドがないため、コメントで記録
# 必要に応じてフィールドを追加する
status='public', # デフォルトステータス
public=True, # 公開設定
hour_5=True, # 5時間イベント
hour_3=False, # 3時間イベントではない
class_general=True, # 一般クラス有効
class_family=True, # ファミリークラス有効
class_solo_male=True, # 男子ソロクラス有効
class_solo_female=True, # 女子ソロクラス有効
# MobServer統合フィールドの設定
event_code=event_code,
start_time=start_time,
event_day=event_day
)
new_event.save()
migrated_count += 1
print(f"✅ 新規作成: {event_code}")
except Exception as e:
error_count += 1
print(f"❌ 移行エラー: {event_code} - {e}")
continue
print(f"\\n=== 移行結果 ===")
print(f"新規作成: {migrated_count}")
print(f"更新完了: {updated_count}")
print(f"移行エラー: {error_count}")
print(f"合計処理: {migrated_count + updated_count + error_count}")
# 移行結果の確認
print(f"\\n=== 移行後データ確認 ===")
migrated_events = NewEvent2.objects.filter(
self_rogaining=False
).order_by('start_datetime')
print(f"移行されたイベント数: {migrated_events.count()}")
for event in migrated_events[:10]:
print(f" {event.event_name}: {event.event_description} ({event.start_datetime})")
except Exception as e:
print(f"❌ 移行処理でエラーが発生しました: {e}")
import traceback
traceback.print_exc()
finally:
if 'gifuroge_conn' in locals():
gifuroge_conn.close()
print("✅ データベース接続を閉じました")
print("\\n=== 移行処理完了 ===")