Files
2026Technology-Competition/src/db/schema.py
T

80 lines
3.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""数据库表结构 DDLSprint 1users / 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()