sqlite3 打开一个真实存在的库(321 MB、99 张表),
列出它的表、看清一张表的结构,并查出三行真实数据 —— 全程不装任何东西,因为你机器上已经装好了。
你的使命里写着:「这台机器上已经有一堆 SQLite 在跑……学会它,既能读懂自己每天在用的工具」。 这不是修辞:只统计用户目录、深度 8 层以内,本机就有 2872 个 SQLite 文件。 浏览器历史、编辑器缓存、AI 工具的记忆库,全是它。
所以第一课不搭玩具库。我们直接打开其中最大的那个 —— 它正好是你每天都在用的那个工具的"记忆"。
.db 文件就是一个完整的库 —— 复制它就是备份,删掉它就是删库。. 开头的(如 .tables)是给命令行工具的指令,以 ; 结尾的才是给数据库的 SQL 语句。原库此刻可能正被别的程序写入。练习只动副本:
# Git Bash
mkdir -p /tmp/sqlite-练习
cp "/c/Users/23652/.local/share/cortexkit/magic-context/context.db" /tmp/sqlite-练习/ctx.db
# PowerShell(等价)
New-Item -ItemType Directory -Force "$env:TEMP\sqlite-练习"
Copy-Item "$env:USERPROFILE\.local\share\cortexkit\magic-context\context.db" "$env:TEMP\sqlite-练习\ctx.db"
sqlite3 /tmp/sqlite-练习/ctx.db
提示符变成 sqlite> 就对了。这时你人在库里。
.tables
.schema memories
SELECT project_path, category, substr(content,1,32) AS excerpt FROM memories LIMIT 3;
你应该看到:
.tables 吐出 99 张表(含 memories、notes、git_commits、以及一堆 *_fts_* 全文检索辅助表).schema memories 给出建表语句:id INTEGER PRIMARY KEY AUTOINCREMENT, project_path TEXT NOT NULL, category TEXT NOT NULL, content TEXT NOT NULL, …excerpt 列里是你自己的笔记摘要 —— 那些是 AI 工具为这个笔记库攒下的"记忆"再试一条,看看规模:
SELECT count(*) FROM memories; -- 429
.quit
如果中文显示成乱码 —— 尤其是你自己写在 SQL 里的中文(比如列别名 AS 内容)——
那是 Windows 控制台的代码页问题,不是库坏了。开一个 UTF-8 代码页再进:
chcp 65001 # Git Bash 里可用 chcp.com 65001;PowerShell 里可先执行此命令
sqlite3 /tmp/sqlite-练习/ctx.db
库里的数据本身永远是 UTF-8;乱码只发生在"控制台 → 终端"这一段。
1. SQLite 的「库」到底是什么?
对。库就是一个文件:复制 = 备份,删除 = 删库。没有常驻进程,也没有端口 —— 这正是它「零配置」的全部原因,也是它不适合高并发写入的原因(下一步课程会讲到)。
2. 点命令和 SQL 语句,区别在哪?
对。以 . 开头的点命令是给 sqlite3 这个命令行工具的(列目录、切换输出格式、读脚本文件);SQL 语句才是发给数据库引擎的。分清这一点,以后就不会问「为什么 .tables 后面不加分号」。
3. 为什么第一步先复制副本?
对。SQLite 允许多个进程读,但写入时会加锁;对着一个正在被写入的库做实验,轻则报 database is locked,重则留下你不理解的中间状态。副本就是你的沙盒 —— 这个习惯请一直保持。