Files
qinqinghuisheng/server/migrate_alerts.py
2025-12-13 14:46:05 +08:00

99 lines
3.0 KiB
Python

"""
数据库迁移脚本 - 升级 family_alerts 表结构
"""
import sqlite3
import os
DB_PATH = os.path.join(os.path.dirname(__file__), 'kinecho.db')
def migrate():
conn = sqlite3.connect(DB_PATH)
cursor = conn.cursor()
try:
# 检查表是否存在
cursor.execute('''
SELECT name FROM sqlite_master
WHERE type='table' AND name='family_alerts'
''')
if cursor.fetchone():
print("表 family_alerts 已存在,开始迁移...")
# 重命名旧表
cursor.execute('ALTER TABLE family_alerts RENAME TO family_alerts_old')
# 创建新表
cursor.execute('''
CREATE TABLE family_alerts (
id INTEGER PRIMARY KEY AUTOINCREMENT,
family_id TEXT NOT NULL,
elderly_id INTEGER,
alert_type TEXT NOT NULL,
level TEXT NOT NULL,
title TEXT,
message TEXT NOT NULL,
metadata TEXT,
source TEXT DEFAULT 'elderly',
handled INTEGER DEFAULT 0,
handled_at TIMESTAMP,
handled_by INTEGER,
reply_message TEXT,
read INTEGER DEFAULT 0,
read_at TIMESTAMP,
is_active INTEGER DEFAULT 1,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (elderly_id) REFERENCES users(id),
FOREIGN KEY (handled_by) REFERENCES users(id)
)
''')
# 复制旧数据
cursor.execute('''
INSERT INTO family_alerts
(id, family_id, alert_type, level, message, handled, handled_at, created_at, updated_at)
SELECT id, family_id, alert_type, level, message, handled, handled_at, created_at, updated_at
FROM family_alerts_old
''')
# 删除旧表
cursor.execute('DROP TABLE family_alerts_old')
print("数据迁移完成!")
else:
print("表不存在,将在初始化时创建")
# 创建索引
cursor.execute('''
CREATE INDEX IF NOT EXISTS idx_family_alerts_family_id
ON family_alerts(family_id)
''')
cursor.execute('''
CREATE INDEX IF NOT EXISTS idx_family_alerts_created_at
ON family_alerts(created_at DESC)
''')
cursor.execute('''
CREATE INDEX IF NOT EXISTS idx_family_alerts_handled
ON family_alerts(handled, created_at DESC)
''')
print("索引创建完成!")
conn.commit()
print("\n✅ 迁移成功!")
except Exception as e:
conn.rollback()
print(f"\n❌ 迁移失败: {e}")
import traceback
traceback.print_exc()
finally:
conn.close()
if __name__ == '__main__':
migrate()