Fix migration error

This commit is contained in:
2025-08-29 09:11:20 +09:00
parent a180c1e258
commit b91b522fa3
26 changed files with 5848 additions and 22 deletions

View File

@ -0,0 +1,216 @@
#!/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=== 移行処理完了 ===")