[1.2] 数据库 DDL - 六张表完整建表 + 初始化脚本

This commit is contained in:
ericwyuan
2026-08-19 22:18:22 +08:00
parent 3a315c7129
commit d6d294bbbe
2 changed files with 256 additions and 0 deletions

125
scripts/init_db.py Normal file
View File

@@ -0,0 +1,125 @@
#!/usr/bin/env python3
"""
Sentinel Home AI - 数据库初始化脚本
执行 DDL 创建所有表,并可插入测试数据。
"""
import sys
import os
import argparse
import mysql.connector
def get_connection(host='127.0.0.1', port=3306, user='root', password=''):
"""获取 MariaDB 连接"""
return mysql.connector.connect(
host=host, port=port, user=user, password=password,
charset='utf8mb4', collation='utf8mb4_unicode_ci'
)
def execute_ddl(conn):
"""执行 DDL 脚本"""
ddl_path = os.path.join(os.path.dirname(__file__), 'ddl.sql')
with open(ddl_path, 'r', encoding='utf-8') as f:
ddl_sql = f.read()
cursor = conn.cursor()
# 按分号分割执行(简单方案,适合无存储过程的 DDL
statements = [s.strip() for s in ddl_sql.split(';') if s.strip() and not s.strip().startswith('--')]
for stmt in statements:
if stmt.upper().startswith('SELECT'):
cursor.execute(stmt)
for row in cursor.fetchall():
print(f" {row[0]}: {row[1] if len(row) > 1 else ''}")
else:
cursor.execute(stmt)
print(f" OK: {stmt[:60]}...")
conn.commit()
cursor.close()
print("\n[OK] DDL 执行完成")
def insert_test_data(conn):
"""插入测试数据"""
cursor = conn.cursor()
# 插入测试任务
cursor.execute("""
INSERT INTO process_tasks (video_path, video_url, status)
VALUES (%s, %s, %s)
""", ('/volume1/surveillance/test.mp4', 'http://100.x.x.10:8000/media/test.mp4?token=xxx', 'SUCCESS'))
task_id = cursor.lastrowid
# 插入测试事件
cursor.execute("""
INSERT INTO monitor_events (task_id, event_start_time, event_end_time, camera_name, global_summary, entities_json, compute_provider)
VALUES (%s, %s, %s, %s, %s, %s, %s)
""", (
task_id,
'2026-08-19 14:00:00',
'2026-08-19 14:30:00',
'客厅',
'客厅有人员走动,汤圆在玩积木。',
'[{"person": "人物A", "action": "在地毯上玩积木", "clothing": "黄色T恤"}]',
'["ollama"]'
))
event_id = cursor.lastrowid
# 插入测试事件明细
cursor.execute("""
INSERT INTO event_details (event_id, task_id, frame_index, frame_timestamp, camera_name, person, action, clothing, is_attention_event, source_providers)
VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
""", (
event_id, task_id, 1, '2026-08-19 14:03:00', '客厅', '人物A', '在地毯上玩积木', '黄色T恤', False, '["ollama"]'
))
cursor.execute("""
INSERT INTO event_details (event_id, task_id, frame_index, frame_timestamp, camera_name, person, action, clothing, is_attention_event, source_providers)
VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
""", (
event_id, task_id, 2, '2026-08-19 14:15:00', '客厅', '人物A', '看绘本', '黄色T恤', False, '["ollama"]'
))
cursor.execute("""
INSERT INTO event_details (event_id, task_id, frame_index, frame_timestamp, camera_name, person, action, clothing, is_attention_event, source_providers)
VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
""", (
event_id, task_id, 3, '2026-08-19 14:25:00', '客厅', '人物A', '跌倒', '黄色T恤', True, '["ollama"]'
))
# 插入测试成员
cursor.execute("""
INSERT IGNORE INTO family_members (abstract_label, real_name, feature_description, first_seen_at)
VALUES (%s, %s, %s, %s)
""", ('人物A', None, '短发、黄色T恤、男性', '2026-08-19 14:03:00'))
conn.commit()
cursor.close()
print(f"[OK] 测试数据插入完成 (task_id={task_id}, event_id={event_id})")
def main():
parser = argparse.ArgumentParser(description='Sentinel Home AI 数据库初始化')
parser.add_argument('--host', default='127.0.0.1', help='MariaDB 主机')
parser.add_argument('--port', type=int, default=3306, help='MariaDB 端口')
parser.add_argument('--user', default='root', help='MariaDB 用户名')
parser.add_argument('--password', default='', help='MariaDB 密码')
parser.add_argument('--test-data', action='store_true', help='插入测试数据')
args = parser.parse_args()
print(f"连接 MariaDB {args.host}:{args.port} ...")
conn = get_connection(args.host, args.port, args.user, args.password)
print("执行 DDL ...")
execute_ddl(conn)
if args.test_data:
print("\n插入测试数据 ...")
insert_test_data(conn)
conn.close()
print("\n完成!")
if __name__ == '__main__':
main()