diff --git a/server/migrate_alerts.py b/server/migrate_alerts.py new file mode 100644 index 0000000..f3f1fab --- /dev/null +++ b/server/migrate_alerts.py @@ -0,0 +1,98 @@ +""" +数据库迁移脚本 - 升级 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()