关于 how-to-store-sqlite-as-nosql-store
这份指南介绍如何用 SQLite 和基于路径的键存储无固定模式的 JSON 文档,面向需要在 SQLite 中保存和查询文档数据的开发者。还可设置 TTL 使过期数据失效。
主要功能
- 01按路径存储 JSON 文档
- 02使用 SQLite JSON 函数
- 03按路径前缀查询集合
- 04可选 TTL 过期设置
- 05删除已过期行
适用场景
- 01在 SQLite 中保存文档形态的数据
- 02查询指定路径前缀下的文档
- 03通过 TTL 清理过期记录
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ rodydavis/ skills --skill how-to-store-sqlite-as-nosql-store安装后在 Claude Code 中输入/how-to-store-sqlite-as-nosql-store确认已加载。
详细介绍
如何将 SQLite 用作 NoSQL 存储
SQLite 是一款功能强大的边缘数据库,可以存储各种形态的数据。
NoSQL 数据库 因为以无模式的方式存储数据而广受欢迎,但这些文档完全可以存储在 SQLite 中。
SQLite 实际上具有出色的 JSON 支持,甚至支持 JSONB。
创建表
要存储 JSON 文档,我们需要创建一张表,以字符串形式存储这些值。
CREATE TABLE documents (
path TEXT NOT NULL PRIMARY KEY,
data TEXT,
ttl INTEGER,
created INTEGER NOT NULL,
updated INTEGER NOT NULL,
UNIQUE(path)
);
路径
数据
TTL
创建时间
更新时间
/posts/1
{"id":1}
NULL
0
0
/posts/2
{"id":2}
NULL
0
0
/users/1
{"id":1}
NULL
0
0
基本思路是存储一个 JSON 对象和一个唯一的路径。
还可以设置可选的 TTL,在行达到过期时间时自动将其删除。
保存文档
要保存文档,我们可以将 JSON 编码为字符串或二进制数据,并使用唯一的路径将其保存到表中。
INSERT OR REPLACE
INTO documents (path, data, ttl, created, updated)
VALUES (:path, :data, :ttl, :created, :updated)
RETURNING *;
你也可以使用 JSON 函数,将对象保存为有效的 JSON 字符串。
INSERT OR REPLACE
INTO documents (path, data, ttl, created, updated)
VALUES ("/posts/1", json('{"id" 1}'), NULL, 0, 0)
RETURNING *;
路径
数据
TTL
创建时间
更新时间
/posts/1
{"id":1}
NULL
0
0
读取文档
要读取文档,只需提供路径。如果设置了 TTL,我们可以 计算当前日期 是否晚于偏移量;若是,则不返回该文档。
SELECT * FROM documents
WHERE path = :path
AND (
(ttl IS NOT NULL AND ttl + updated < unixepoch())
OR
ttl IS NULL
);
路径
数据
TTL
创建时间
更新时间
/posts/1
{"id":1}
NULL
0
0
获取集合中的文档
我们可以使用一些内置函数和路径前缀,查询指定集合中的所有文档:
SELECT *
FROM documents
WHERE (
path LIKE :prefix
AND
(LENGTH(path) - LENGTH(REPLACE(path, '/', ''))) = (LENGTH(:prefix) - LENGTH(REPLACE(:prefix, '/', '')))
)
AND (
(ttl IS NOT NULL AND ttl + updated < unixepoch())
OR
ttl IS NULL
)
ORDER BY created;
搜索时,:prefix 末尾应带有 /%:
"/my/path/%" // search for /my/path
删除过期文档
使用 TTL 字段,我们可以删除所有过期文档:
DELETE FROM documents
WHERE ttl IS NOT NULL
AND ttl + updated < unixepoch();