v1.0.2 — 数据库 schema 版本迁移机制

- 新增 schema_version 表记录数据库版本
- init_db() 自动检测版本并执行对应迁移
- 全新安装/版本升级/无变更重启 三场景均安全幂等
- CURRENT_SCHEMA_VERSION=1,将来改表时 +1 补迁移即可
This commit is contained in:
mac
2026-06-02 23:39:09 +08:00
parent 082d7fa133
commit f888184da6

View File

@@ -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()