代码与工具 4 分钟阅读

SQLite 里的私人账本

我一直有个不太正经的需求:记录一些只有我会看的数据。比如每天喝了几杯水、跑步时耳机里循环的是哪首歌、某段代码改到第几版才跑通。这 […]

SQLite 里的私人账本

我一直有个不太正经的需求:记录一些只有我会看的数据。比如每天喝了几杯水、跑步时耳机里循环的是哪首歌、某段代码改到第几版才跑通。这些东西发朋友圈太琐碎,写进博客又不够格,扔进备忘录里最后连自己都找不到。试过 Notion,模板越搭越复杂,打开速度越来越慢;试过纯文本,写到第三周就忘了格式。最后我回到 SQLite,一个文件,一条命令,反而踏实了。

为什么是 SQLite

选它不是因为性能,而是因为它足够「不打扰」。一个 .db 文件就是全部,复制走就能备份,用 sqlite3 命令行就能查,不需要开服务、不需要账号、不需要联网。我试过用 JSON 存,但每次追加都要读全量、改结构、再写回,写个小脚本比用数据库还啰嗦。SQLite 自带事务和索引,查「上个月喝水量」这种问题,一句 SQL 就完了。

关键是它允许我懒。表结构可以先随便定,用着用着再 ALTER TABLE 加列。私人数据本来就没有产品经理催你定需求,边用边改才是常态。

先建一张丑表

我的第一张表叫 daily,字段只有三个:日期、项目、数值。

CREATE TABLE daily (day TEXT, item TEXT, value REAL);

够丑,但够用。喝水记 1,跑步记公里数,写代码记小时数。项目名就是自由文本,不用外键,不用枚举。私人数据最大的敌人是过度设计——你花两小时设计 schema,最后只记了三天。

后来发现光有数值不够,有些事需要一句话备注。于是加了一列 note TEXT,默认空。再后来想按周汇总,加了个 week 字段冗余存一下,省得每次查都要算。改表就三行命令,改完历史数据还在,这种低摩擦的迭代感是 SQLite 最舒服的地方。

用 shell 当输入法

我不想要 App,也不想打开数据库客户端。最顺手的输入方式是在终端里敲一行:

sqlite3 life.db "INSERT INTO daily VALUES(date('now'),'water',1,'')"

一行命令记一杯水,绑个 alias 叫 w。跑步回来敲 r 5.2,代码跑通敲 c 2。备注用另一个 alias,带引号传进去。整个过程不到两秒,比解锁手机找 App 快得多。

查询也一样。看今天记了什么:SELECT * FROM daily WHERE day=date('now')。看这周喝水总量:SELECT sum(value) FROM daily WHERE item='water' AND day>=date('now','-7 days')。SQL 写多了会形成肌肉记忆,想查什么随手就写,不用等界面加载。

让它自己说话

数据躺在文件里没人看,等于没记。我加了一个 cron,每周日晚上跑一个脚本,把本周的汇总拼成几行纯文本,发到自己的邮箱或者直接写进一个 weekly.md。脚本很短:查总量、查最常出现的项目、查备注里出现最多的词,拼起来就完事。

这一步很关键。私人数据不需要仪表盘,但需要一个「被看见」的瞬间。每周收到那几行字,我会想起这周干了什么,也会顺手改改下周的记录习惯。数据不是给别人看的报表,是给自己的回声。

现在这个 life.db 跟着我快一年了,文件不大,备份就是复制。偶尔用 sqlite3 打开翻翻,能看到某天备注里写着「第一次跑完五公里」,旁边数值是 5.0。这种只有自己懂的细节,放在任何云端工具里都显得多余,放在一个文件里刚刚好。

留下你的回声