diff --git a/src/vitals/core/database.py b/src/vitals/core/database.py index 5187800..57d5d89 100644 --- a/src/vitals/core/database.py +++ b/src/vitals/core/database.py @@ -61,76 +61,78 @@ def get_connection(): def init_db(): """初始化数据库表""" - with get_connection() as conn: - cursor = conn.cursor() - + with get_connection() as (conn, cursor): # 运动记录表 cursor.execute(""" CREATE TABLE IF NOT EXISTS exercise ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - user_id INTEGER DEFAULT 1, + id INT PRIMARY KEY AUTO_INCREMENT, + user_id INT DEFAULT 1, date DATE NOT NULL, - type TEXT NOT NULL, - duration INTEGER NOT NULL, - calories INTEGER DEFAULT 0, - distance REAL, - heart_rate_avg INTEGER, - source TEXT DEFAULT '手动', + type VARCHAR(100) NOT NULL, + duration INT NOT NULL, + calories INT DEFAULT 0, + distance FLOAT, + heart_rate_avg INT, + source VARCHAR(50) DEFAULT '手动', raw_data TEXT, - notes TEXT + notes TEXT, + INDEX idx_exercise_date (date) ) """) # 饮食记录表 cursor.execute(""" CREATE TABLE IF NOT EXISTS meal ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - user_id INTEGER DEFAULT 1, + id INT PRIMARY KEY AUTO_INCREMENT, + user_id INT DEFAULT 1, date DATE NOT NULL, - meal_type TEXT NOT NULL, + meal_type VARCHAR(50) NOT NULL, description TEXT, - calories INTEGER DEFAULT 0, - protein REAL, - carbs REAL, - fat REAL, - photo_path TEXT, - food_items TEXT + calories INT DEFAULT 0, + protein FLOAT, + carbs FLOAT, + fat FLOAT, + photo_path VARCHAR(500), + food_items TEXT, + INDEX idx_meal_date (date) ) """) # 睡眠记录表 cursor.execute(""" CREATE TABLE IF NOT EXISTS sleep ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - user_id INTEGER DEFAULT 1, + id INT PRIMARY KEY AUTO_INCREMENT, + user_id INT DEFAULT 1, date DATE NOT NULL, - bedtime TEXT, - wake_time TEXT, - duration REAL NOT NULL, - quality INTEGER DEFAULT 3, - deep_sleep_mins INTEGER, - source TEXT DEFAULT '手动', - notes TEXT + bedtime VARCHAR(20), + wake_time VARCHAR(20), + duration FLOAT NOT NULL, + quality INT DEFAULT 3, + deep_sleep_mins INT, + source VARCHAR(50) DEFAULT '手动', + notes TEXT, + INDEX idx_sleep_date (date) ) """) # 体重记录表 cursor.execute(""" CREATE TABLE IF NOT EXISTS weight ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - user_id INTEGER DEFAULT 1, + id INT PRIMARY KEY AUTO_INCREMENT, + user_id INT DEFAULT 1, date DATE NOT NULL, - weight_kg REAL NOT NULL, - body_fat_pct REAL, - muscle_mass REAL, - notes TEXT + weight_kg FLOAT NOT NULL, + body_fat_pct FLOAT, + muscle_mass FLOAT, + notes TEXT, + INDEX idx_weight_date (date) ) """) # 用户配置表 cursor.execute(""" CREATE TABLE IF NOT EXISTS config ( - key TEXT PRIMARY KEY, + `key` VARCHAR(100) PRIMARY KEY, value TEXT ) """) @@ -138,57 +140,49 @@ def init_db(): # 用户表 cursor.execute(""" CREATE TABLE IF NOT EXISTS users ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - name TEXT NOT NULL UNIQUE, - created_at TEXT NOT NULL, - is_active INTEGER DEFAULT 0, - gender TEXT, - height_cm REAL, - weight_kg REAL, - age INTEGER, - password_hash TEXT, - email TEXT, - is_admin INTEGER DEFAULT 0, - is_disabled INTEGER DEFAULT 0 + id INT PRIMARY KEY AUTO_INCREMENT, + name VARCHAR(255) NOT NULL UNIQUE, + created_at DATETIME NOT NULL, + is_active TINYINT DEFAULT 0, + gender VARCHAR(10), + height_cm FLOAT, + weight_kg FLOAT, + age INT, + password_hash VARCHAR(255), + email VARCHAR(255), + is_admin TINYINT DEFAULT 0, + is_disabled TINYINT DEFAULT 0 ) """) # 邀请码表 cursor.execute(""" CREATE TABLE IF NOT EXISTS invites ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - code TEXT NOT NULL UNIQUE, - created_by INTEGER NOT NULL, - used_by INTEGER, - created_at TEXT NOT NULL, - expires_at TEXT, - FOREIGN KEY (created_by) REFERENCES users(id), - FOREIGN KEY (used_by) REFERENCES users(id) + id INT PRIMARY KEY AUTO_INCREMENT, + code VARCHAR(100) NOT NULL UNIQUE, + created_by INT NOT NULL, + used_by INT, + created_at DATETIME NOT NULL, + expires_at DATETIME ) """) # 阅读记录表 cursor.execute(""" CREATE TABLE IF NOT EXISTS reading ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - user_id INTEGER DEFAULT 1, + id INT PRIMARY KEY AUTO_INCREMENT, + user_id INT DEFAULT 1, date DATE NOT NULL, - title TEXT NOT NULL, - author TEXT, - cover_url TEXT, - duration INTEGER DEFAULT 0, - mood TEXT, - notes TEXT + title VARCHAR(500) NOT NULL, + author VARCHAR(255), + cover_url VARCHAR(1000), + duration INT DEFAULT 0, + mood VARCHAR(50), + notes TEXT, + INDEX idx_reading_date (date) ) """) - # 创建索引 - cursor.execute("CREATE INDEX IF NOT EXISTS idx_exercise_date ON exercise(date)") - cursor.execute("CREATE INDEX IF NOT EXISTS idx_meal_date ON meal(date)") - cursor.execute("CREATE INDEX IF NOT EXISTS idx_sleep_date ON sleep(date)") - cursor.execute("CREATE INDEX IF NOT EXISTS idx_weight_date ON weight(date)") - cursor.execute("CREATE INDEX IF NOT EXISTS idx_reading_date ON reading(date)") - # ===== 运动记录 =====