217 lines
9.5 KiB
Python
217 lines
9.5 KiB
Python
#!/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=== 移行処理完了 ===")
|