99 lines
3.0 KiB
Python
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()
|