80 lines
3.1 KiB
Python
80 lines
3.1 KiB
Python
"""数据库表结构 DDL(Sprint 1:users / preferences / ppt_records / versions / chat_messages)。"""
|
||
|
||
SCHEMA_SQL = """
|
||
CREATE TABLE IF NOT EXISTS users (
|
||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||
username TEXT UNIQUE NOT NULL,
|
||
password_hash TEXT NOT NULL,
|
||
created_at TEXT NOT NULL DEFAULT (datetime('now', 'localtime'))
|
||
);
|
||
|
||
CREATE TABLE IF NOT EXISTS preferences (
|
||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||
user_id INTEGER NOT NULL,
|
||
default_scene TEXT NOT NULL DEFAULT 'training',
|
||
default_color TEXT NOT NULL DEFAULT 'blue',
|
||
default_language TEXT NOT NULL DEFAULT 'zh',
|
||
default_canvas TEXT NOT NULL DEFAULT 'ppt169',
|
||
default_image_strategy TEXT NOT NULL DEFAULT 'web',
|
||
default_page_min INTEGER NOT NULL DEFAULT 10,
|
||
default_page_max INTEGER NOT NULL DEFAULT 15,
|
||
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
||
);
|
||
CREATE UNIQUE INDEX IF NOT EXISTS idx_preferences_user ON preferences(user_id);
|
||
|
||
CREATE TABLE IF NOT EXISTS ppt_records (
|
||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||
user_id INTEGER NOT NULL,
|
||
title TEXT NOT NULL,
|
||
content TEXT NOT NULL,
|
||
scene TEXT NOT NULL,
|
||
language TEXT NOT NULL DEFAULT 'zh',
|
||
canvas TEXT NOT NULL DEFAULT 'ppt169',
|
||
image_strategy TEXT NOT NULL DEFAULT 'web',
|
||
color_scheme TEXT NOT NULL,
|
||
page_min INTEGER NOT NULL,
|
||
page_max INTEGER NOT NULL,
|
||
status TEXT NOT NULL DEFAULT 'processing',
|
||
file_size INTEGER,
|
||
page_count INTEGER,
|
||
generate_duration INTEGER,
|
||
created_at TEXT NOT NULL DEFAULT (datetime('now', 'localtime')),
|
||
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
||
);
|
||
CREATE INDEX IF NOT EXISTS idx_records_user_time ON ppt_records(user_id, created_at DESC);
|
||
CREATE INDEX IF NOT EXISTS idx_records_user_scene ON ppt_records(user_id, scene);
|
||
|
||
CREATE TABLE IF NOT EXISTS versions (
|
||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||
record_id INTEGER NOT NULL,
|
||
version_no INTEGER NOT NULL,
|
||
file_path TEXT NOT NULL,
|
||
svg_dir TEXT,
|
||
change_note TEXT,
|
||
created_at TEXT NOT NULL DEFAULT (datetime('now', 'localtime')),
|
||
FOREIGN KEY (record_id) REFERENCES ppt_records(id) ON DELETE CASCADE
|
||
);
|
||
CREATE INDEX IF NOT EXISTS idx_versions_record ON versions(record_id);
|
||
|
||
CREATE TABLE IF NOT EXISTS chat_messages (
|
||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||
record_id INTEGER NOT NULL,
|
||
role TEXT NOT NULL,
|
||
content TEXT NOT NULL,
|
||
created_at TEXT NOT NULL DEFAULT (datetime('now', 'localtime')),
|
||
FOREIGN KEY (record_id) REFERENCES ppt_records(id) ON DELETE CASCADE
|
||
);
|
||
CREATE INDEX IF NOT EXISTS idx_chat_record ON chat_messages(record_id, created_at);
|
||
"""
|
||
|
||
|
||
def init_db() -> None:
|
||
"""执行全部 DDL,幂等可重复调用。"""
|
||
from .conn import get_connection
|
||
|
||
conn = get_connection()
|
||
try:
|
||
conn.executescript(SCHEMA_SQL)
|
||
conn.commit()
|
||
finally:
|
||
conn.close() |