import sqlite3 import os DB_PATH = os.path.join(os.path.dirname(__file__), "stock_data.db") SCHEMA_SQL = """ CREATE TABLE IF NOT EXISTS stock_collections ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, description TEXT, user_id TEXT NOT NULL DEFAULT '', last_accessed_at TEXT NOT NULL DEFAULT (datetime('now','localtime')), created_at TEXT NOT NULL DEFAULT (datetime('now','localtime')), updated_at TEXT NOT NULL DEFAULT (datetime('now','localtime')) ); CREATE TABLE IF NOT EXISTS collection_stocks ( id INTEGER PRIMARY KEY AUTOINCREMENT, collection_id INTEGER NOT NULL REFERENCES stock_collections(id) ON DELETE CASCADE, stock_code TEXT NOT NULL, stock_name TEXT NOT NULL, added_price REAL, added_at TEXT NOT NULL DEFAULT (datetime('now','localtime')), UNIQUE(collection_id, stock_code) ); CREATE TABLE IF NOT EXISTS share_links ( id INTEGER PRIMARY KEY AUTOINCREMENT, collection_id INTEGER NOT NULL REFERENCES stock_collections(id) ON DELETE CASCADE, short_code TEXT NOT NULL UNIQUE, created_at TEXT NOT NULL DEFAULT (datetime('now','localtime')), expires_at TEXT ); CREATE TABLE IF NOT EXISTS cache ( key TEXT PRIMARY KEY, value TEXT NOT NULL, expires_at TEXT NOT NULL ); """ def get_connection() -> sqlite3.Connection: conn = sqlite3.connect(DB_PATH) conn.row_factory = sqlite3.Row conn.execute("PRAGMA foreign_keys = ON") return conn def init_db(): conn = get_connection() conn.executescript(SCHEMA_SQL) # 清理过期缓存 from services.cache import clean_expired clean_expired() conn.commit() conn.close() def dict_from_row(row: sqlite3.Row) -> dict: if row is None: return None return dict(row)