66 lines
1.7 KiB
Python
66 lines
1.7 KiB
Python
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)
|