我自己写了个查询工具,何自就为了查我过去三年记的己做据库己查每笔钱花哪儿了。这事儿的个数供自起点特别朴素——记账App导出数据后,我想问“去年六月我在外卖上花了多少”,何自它答不上来。己做据库己查Excel能查,个数供自但打开要等五秒,何自公式写起来也烦。己做据库己查于是个数供自我用Python写了个本地数据库,前后花了大概一个下午。何自
核心就三件事:存数据、己做据库己查建索引、个数供自写查询。何自别想复杂了,己做据库己查SQLite就是个数供自干这个的,Python自带,不用装服务器。我把记账App导出的CSV文件读进去,建了个表,字段就是日期、类别、金额、备注。就这么简单,但已经能回答我90%的问题。
关键一步是建索引。没索引时查“去年六月”得扫全表,一万多条记录要等零点几秒,有索引后瞬间出结果。索引就像书后面的目录,你告诉数据库“我经常按日期查”,它就把日期列单独排个序,查询时直接跳着找。这步在SQLite里就一行代码:CREATE INDEX idx_date ON transactions(date); 但大多数人第一次做会漏掉,然后抱怨“数据库怎么这么慢”。
查询部分我直接写了个命令行小工具。输入python query.py --month 2024-06 --category 外卖,它就返回总额和每笔明细。这里用了个小技巧:把常用查询封装成函数,参数化输入,防止SQL注入——虽然自己用无所谓,但养成习惯没坏处。
有个坑值得说。刚开始我把所有备注都存成文本,结果查“咖啡”时把“咖啡色衣服”也带出来了。后来我加了关键词分词,用空格分隔,查询时用LIKE '%咖啡%'匹配,但只搜备注的前五个字。这算是个妥协方案,但对个人数据够用了。专业做法是用全文搜索,SQLite有FTS5扩展,不过对我来说杀鸡用牛刀。
数据量上来后,删改也麻烦。我一开始没设主键,结果重复导入了三次数据,查出来金额翻倍。后来加了UNIQUE(date, amount, note)约束,重复导入时自动跳过。这教训是:哪怕是个人项目,也要一开始就考虑数据完整性,别偷懒。
现在这个库跑了快两年,大概三万条记录,查询都在几十毫秒内。最爽的是我能问“过去三个月每周五晚上我平均花多少”,这种问题在Excel里要写嵌套公式,在数据库里就是一条SELECT AVG(amount) FROM transactions WHERE strftime('%w', date) = '5' AND date > date('now', '-3 months') GROUP BY strftime('%Y-%W', date); 虽然SQL语法看着吓人,但写熟了就那十几个关键词。
你要是想试试,我建议别从零开始建表。找个现成的ORM(比如SQLAlchemy)定义个类,自动生成表结构,省去手写SQL的麻烦。但底层逻辑还是那三件事——存、索引、查。别被“数据库”三个字吓着,本质就是个有组织的文件柜,你按自己的习惯整理,比什么Notion、Airtable都顺手。而且数据全在自己电脑上,不怕哪天服务商跑路。