From abdc1fc7392dd3ba0e6792463c63618550b409cd Mon Sep 17 00:00:00 2001 From: mac Date: Tue, 2 Jun 2026 23:39:09 +0800 Subject: [PATCH] =?UTF-8?q?v1.0.2=20=E2=80=94=20=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93=20schema=20=E7=89=88=E6=9C=AC=E8=BF=81=E7=A7=BB?= =?UTF-8?q?=E6=9C=BA=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 schema_version 表记录数据库版本 - init_db() 自动检测版本并执行对应迁移 - 全新安装/版本升级/无变更重启 三场景均安全幂等 - CURRENT_SCHEMA_VERSION=1,将来改表时 +1 补迁移即可 --- database.py | 52 +++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 43 insertions(+), 9 deletions(-) diff --git a/database.py b/database.py index 834f998..9767818 100644 --- a/database.py +++ b/database.py @@ -10,6 +10,9 @@ DB_DIR = os.path.join(os.path.expanduser('~'), '.workbuddy', 'data', 'ziwei-powe os.makedirs(DB_DIR, exist_ok=True) DB_PATH = os.path.join(DB_DIR, 'ziwei_power.db') +# 当前数据库 schema 版本 —— 改表结构时必须 +1 并补迁移逻辑 +CURRENT_SCHEMA_VERSION = 1 + def get_conn(): conn = sqlite3.connect(DB_PATH) @@ -17,18 +20,49 @@ def get_conn(): return conn -def init_db(): - """初始化数据库表""" - conn = get_conn() +def _get_schema_version(conn): + """读取当前数据库的 schema 版本,无表时返回 0""" conn.execute(''' - CREATE TABLE IF NOT EXISTS checkins ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - date TEXT UNIQUE NOT NULL, - data TEXT NOT NULL, - created_at TEXT NOT NULL, - updated_at TEXT NOT NULL + CREATE TABLE IF NOT EXISTS schema_version ( + version INTEGER NOT NULL ) ''') + row = conn.execute('SELECT version FROM schema_version').fetchone() + return row['version'] if row else 0 + + +def _set_schema_version(conn, version): + """写入 schema 版本""" + conn.execute('DELETE FROM schema_version') + conn.execute('INSERT INTO schema_version (version) VALUES (?)', (version,)) + + +def init_db(): + """初始化数据库表 & 自动迁移""" + conn = get_conn() + current = _get_schema_version(conn) + + # ── 迁移步骤(按版本号递增)──────────────────────── + if current < 1: + # v1: 初始表结构 + conn.execute(''' + CREATE TABLE IF NOT EXISTS checkins ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + date TEXT UNIQUE NOT NULL, + data TEXT NOT NULL, + created_at TEXT NOT NULL, + updated_at TEXT NOT NULL + ) + ''') + + # ── 将来加字段/改表在此扩展 ── + # if current < 2: + # conn.execute('ALTER TABLE checkins ADD COLUMN tags TEXT DEFAULT ""') + # # 可选:对已有行做数据补全 + # conn.execute("UPDATE checkins SET tags = '[]' WHERE tags IS NULL") + + # ── 写入最新版本号 ── + _set_schema_version(conn, CURRENT_SCHEMA_VERSION) conn.commit() conn.close()