SQLite 教学工作区 · 课程 0001 · 约 15 分钟 · 前置:无 · 2026-09-24

打开你机器上的一个真库

这节课的胜利:用 sqlite3 打开一个真实存在的库(321 MB、99 张表), 列出它的表、看清一张表的结构,并查出三行真实数据 —— 全程不装任何东西,因为你机器上已经装好了。

为什么是这一步

你的使命里写着:「这台机器上已经有一堆 SQLite 在跑……学会它,既能读懂自己每天在用的工具」。 这不是修辞:只统计用户目录、深度 8 层以内,本机就有 2872 个 SQLite 文件。 浏览器历史、编辑器缓存、AI 工具的记忆库,全是它。

所以第一课不搭玩具库。我们直接打开其中最大的那个 —— 它正好是你每天都在用的那个工具的"记忆"。

最小知识(三条,够用就行)

  1. 库 = 一个文件。SQLite 没有服务器进程,没有端口,没有账号。一个 .db 文件就是一个完整的库 —— 复制它就是备份,删掉它就是删库。
  2. 库 > 表 > 行。一个库里有多张表,一张表里有若干行,每行有若干列。你刚才看到的 321 MB,就是 99 张表撑起来的。
  3. 点命令和 SQL 是两种东西。以 . 开头的(如 .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;

你应该看到:

再试一条,看看规模:

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,重则留下你不理解的中间状态。副本就是你的沙盒 —— 这个习惯请一直保持。