Fix migration error
This commit is contained in:
216
migrate_event_table_to_rog_newevent2.py
Normal file
216
migrate_event_table_to_rog_newevent2.py
Normal 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=== 移行処理完了 ===")
|
||||
Reference in New Issue
Block a user