Fix migration issues
This commit is contained in:
@ -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
|
||||
|
||||
Reference in New Issue
Block a user