Fix migration issues

This commit is contained in:
2025-08-25 14:28:30 +09:00
parent 961c577ec8
commit 6886ba15c8
7 changed files with 403 additions and 28 deletions

View File

@ -89,6 +89,19 @@ def check_database_connectivity():
source_cursor.execute("SELECT COUNT(*) FROM gps_information")
source_count = source_cursor.fetchone()[0]
print(f"✅ gifuroge DB接続成功: gps_information {source_count}")
# テーブル構造確認
source_cursor.execute("""
SELECT column_name, data_type
FROM information_schema.columns
WHERE table_name = 'gps_information'
ORDER BY ordinal_position
""")
columns = source_cursor.fetchall()
print("📋 gps_informationテーブル構造:")
for col_name, col_type in columns:
print(f" {col_name}: {col_type}")
source_conn.close()
# rogdb DB接続確認
@ -97,6 +110,19 @@ def check_database_connectivity():
target_cursor.execute("SELECT COUNT(*) FROM rog_gpscheckin")
target_count = target_cursor.fetchone()[0]
print(f"✅ rogdb DB接続成功: rog_gpscheckin {target_count}")
# 移行先テーブル構造確認
target_cursor.execute("""
SELECT column_name, data_type
FROM information_schema.columns
WHERE table_name = 'rog_gpscheckin'
ORDER BY ordinal_position
""")
target_columns = target_cursor.fetchall()
print("📋 rog_gpscheckinテーブル構造:")
for col_name, col_type in target_columns:
print(f" {col_name}: {col_type}")
target_conn.close()
return True
@ -225,17 +251,61 @@ def migrate_gps_data(source_cursor, target_cursor):
print("\n=== GPS記録データの移行 ===")
try:
# GPS記録のみを取得(不正な写真記録データを除外)
# 移行元テーブルの構造を確認
source_cursor.execute("""
SELECT
serial_number, team_name, cp_number, record_time,
goal_time, late_point, buy_flag, image_address,
minus_photo_flag, create_user, update_user,
colabo_company_memo
SELECT column_name
FROM information_schema.columns
WHERE table_name = 'gps_information'
ORDER BY ordinal_position
""")
source_columns = [row[0] for row in source_cursor.fetchall()]
print(f"📋 移行元カラム: {source_columns}")
# 移行先テーブルの構造を確認
target_cursor.execute("""
SELECT column_name
FROM information_schema.columns
WHERE table_name = 'rog_gpscheckin'
ORDER BY ordinal_position
""")
target_columns = [row[0] for row in target_cursor.fetchall()]
print(f"📋 移行先カラム: {target_columns}")
# 必要なカラムのマッピングを確認
column_mapping = {
'serial_number': 'serial_number',
'team_name': 'team_name' if 'team_name' in source_columns else None,
'zekken_number': 'zekken_number' if 'zekken_number' in source_columns else None,
'event_code': 'event_code' if 'event_code' in source_columns else None,
'cp_number': 'cp_number',
'record_time': 'create_at' if 'create_at' in source_columns else 'record_time',
'goal_time': 'goal_time',
'late_point': 'late_point',
'buy_flag': 'buy_flag',
'image_address': 'image_address',
'minus_photo_flag': 'minus_photo_flag',
'create_user': 'create_user',
'update_user': 'update_user',
'colabo_company_memo': 'colabo_company_memo'
}
# 実際に存在するカラムでクエリを構築
select_columns = []
for key, column in column_mapping.items():
if column and column in source_columns:
select_columns.append(f"{column} as {key}")
else:
select_columns.append(f"NULL as {key}")
query = f"""
SELECT {', '.join(select_columns)}
FROM gps_information
WHERE serial_number < 20000 -- GPS専用データのみ
ORDER BY serial_number
""")
"""
print(f"📋 実行クエリ: {query}")
source_cursor.execute(query)
gps_records = source_cursor.fetchall()
print(f"移行対象GPS記録数: {len(gps_records)}")
@ -245,10 +315,25 @@ def migrate_gps_data(source_cursor, target_cursor):
for record in gps_records:
try:
(serial_number, team_name, cp_number, record_time,
goal_time, late_point, buy_flag, image_address,
minus_photo_flag, create_user, update_user,
colabo_company_memo) = record
# レコードを解析NULLの場合はデフォルト値を設定
record_data = {}
for i, key in enumerate(column_mapping.keys()):
record_data[key] = record[i] if i < len(record) else None
serial_number = record_data['serial_number']
team_name = record_data['team_name'] or f"Team_{record_data['zekken_number'] or serial_number}"
zekken_number = record_data['zekken_number'] or serial_number
event_code = record_data['event_code'] or 'unknown'
cp_number = record_data['cp_number']
record_time = record_data['record_time']
goal_time = record_data['goal_time']
late_point = record_data['late_point']
buy_flag = record_data['buy_flag']
image_address = record_data['image_address']
minus_photo_flag = record_data['minus_photo_flag']
create_user = record_data['create_user']
update_user = record_data['update_user']
colabo_company_memo = record_data['colabo_company_memo']
# UTC時刻をJST時刻に変換
record_time_jst = convert_utc_to_jst(record_time)
@ -265,18 +350,29 @@ def migrate_gps_data(source_cursor, target_cursor):
elif isinstance(goal_time, datetime):
goal_time_utc = convert_utc_to_jst(goal_time)
# rog_gpscheckinに挿入(マイグレーション用マーカー付き)
target_cursor.execute("""
INSERT INTO rog_gpscheckin
(serial_number, team_name, cp_number, record_time, goal_time,
late_point, buy_flag, image_address, minus_photo_flag,
create_user, update_user, comment)
VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
""", (
serial_number, team_name, cp_number, record_time_jst, goal_time_utc,
late_point, buy_flag, image_address, minus_photo_flag,
create_user, update_user, 'migrated_from_gifuroge'
))
# 移行先テーブルに合わせてINSERT文を動的構築
insert_columns = ['serial_number', 'cp_number', 'record_time', 'goal_time',
'late_point', 'buy_flag', 'image_address', 'minus_photo_flag',
'create_user', 'update_user', 'comment']
insert_values = [serial_number, cp_number, record_time_jst, goal_time_utc,
late_point, buy_flag, image_address, minus_photo_flag,
create_user, update_user, f'migrated_from_gifuroge_team_{team_name}_zekken_{zekken_number}_event_{event_code}']
# 移行先テーブルに存在するカラムのみを使用
final_columns = []
final_values = []
for i, col in enumerate(insert_columns):
if col in target_columns:
final_columns.append(col)
final_values.append(insert_values[i])
placeholders = ', '.join(['%s'] * len(final_columns))
columns_str = ', '.join(final_columns)
target_cursor.execute(f"""
INSERT INTO rog_gpscheckin ({columns_str})
VALUES ({placeholders})
""", final_values)
migrated_count += 1
@ -287,6 +383,11 @@ def migrate_gps_data(source_cursor, target_cursor):
except Exception as e:
error_count += 1
print(f" レコード移行エラー(serial_number={serial_number}): {e}")
# トランザクションエラーの場合はロールバックして続行
try:
target_cursor.connection.rollback()
except:
pass
if error_count > 100: # エラー上限
print("❌ エラー数が上限を超えました。移行を中止します。")
raise