简介
sqlite-utils 是 Simon Willison 跟 Datasette 配套的 Python 库 + CLI —— 把杂乱的 CSV / JSON / YAML / JSONL 灌进 SQLite,自动推断 schema,再用一行命令做 enrich、transform、upsert、全文检索索引。适合数据新闻导入、日志摄入、agent 记忆库、任何「我有数据,想能查」的任务。兼容现代 Python + SQLite 3.31+。装机时间 2 分钟。
安装
pip install sqlite-utilsCSV → SQLite(一行命令)
# 从数据自动检测列类型,包括日期和整数
sqlite-utils insert data.db articles articles.csv --csv
# JSON 对象数组
curl https://api.example.com/articles | sqlite-utils insert data.db articles -
# JSONL 流
sqlite-utils insert data.db logs logs.jsonl --nl加索引 + 全文检索
# 列上加 B-tree 索引
sqlite-utils create-index data.db articles category
# 跨列 FTS5 全文索引
sqlite-utils enable-fts data.db articles title body --create-triggers
# 之后这就快了:
sqlite-utils search data.db articles "machine learning"Python API(比 CLI 更丰富)
import sqlite_utils
db = sqlite_utils.Database("data.db")
# 复合主键 upsert
db["articles"].upsert_all([
{"id": 1, "title": "Hello", "category": "intro"},
{"id": 2, "title": "World", "category": "intro"},
], pk="id")
# 加计算列
db["articles"].add_column("word_count", int)
for row in db["articles"].rows:
db["articles"].update(row["id"], {"word_count": len(row["body"].split())})
# 原地变 schema
db["articles"].transform(
drop={"old_column"},
rename={"body": "content"},
column_order=["id", "title", "content"],
)跟 Datasette 配合
sqlite-utils insert data.db log access.csv --csv
datasette serve data.db # 立刻拿到导入数据的 web UI + JSON APIFAQ
Q: 为啥不用 pandas + to_sql? A: 已经用 pandas 没问题。sqlite-utils 为 shell 优先 + 陌生数据设计 —— 自动 schema、upsert、FTS、JSON 流都是头等 CLI 命令不是 flag。多数新闻 / 日志处理任务在 shell 里更快搞定。
Q: 百万行级导入扛得住吗?
A: 扛得住 —— SQLite 处理十亿级行。sqlite-utils 流式读 JSONL/CSV 不把整个文件加载内存。超大导入用 --batch-size 1000 控制事务大小。
Q: sqlite3 WAL 模式能用吗? A: 能 —— sqlite-utils 尊重已有 pragma。Datasette serve 的 DB 建议 WAL 模式,导入时读者不阻塞写者。